/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.main;
import org.opencms.configuration.CmsParameterConfiguration;
import org.opencms.file.CmsResource;
import org.opencms.util.CmsFileUtil;
import java.io.File;
import java.net.URL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.helpers.Loader;
/**
* Provides the OpenCms logging mechanism.<p>
*
* The OpenCms logging mechanism is based on Apache Commons Logging.
* However, log4j is shipped with OpenCms and assumed to be used as default logging mechanism.
* Since apparently Commons Logging may cause issues in more complex classloader scenarios,
* we may switch the logging interface to log4j <code>UGLI</code> once the final release is available.<p>
*
* The log4j configuration file shipped with OpenCms is located
* in <code>${opencms.WEB-INF}/classes/log4j.properties</code>. OpenCms will auto-configure itself
* to write it's log file to <code>${opencms.WEB-INF}/logs/opencms.log</code>. This default behaviour
* can be supressed by either using a log4j configuration file from another location, or by setting the
* special property <code>${opencms.set.logfile}</code> in the log4j configuration file to <code>false</code>.
*
* @since 6.0.0
*/
public final class CmsLog {
/** The name of the opencms.log file. */
public static final String FILE_LOG = "opencms.log";
/** Path to the "logs" folder relative to the "WEB-INF" directory of the application. */
public static final String FOLDER_LOGS = "logs" + File.separatorChar;
/** Log for initialization messages. */
public static final Log INIT = LogFactory.getLog("org.opencms.init");
/** The absolute path to the OpenCms log file (in the "real" file system). */
private static String m_logFileRfsPath;
/** The absolute path to the folder of the main OpenCms log file (in the "real" file system). */
private static String m_logFileRfsFolder;
/**
* Hides the public constructor.<p>
*/
private CmsLog() {
// hides the public constructor
}
/**
* Initializes the OpenCms logger configuration.<p>
*/
static {
try {
// look for the log4j.properties that shipped with OpenCms
URL url = Loader.getResource("log4j.properties");
if (url != null) {
// found some log4j properties, let's see if these are the ones used by OpenCms
String path = CmsFileUtil.normalizePath(url, '/');
// in a default OpenCms configuration, the following path would point to the OpenCms "WEB-INF" folder
String webInfPath = CmsResource.getParentFolder(CmsResource.getFolderPath(path));
// check for the OpenCms configuration file
// check for the OpenCms tld file
String tldFilePath = webInfPath + CmsSystemInfo.FILE_TLD;
File tldFile = new File(tldFilePath);
if (tldFile.exists()) {
// assume this is a default OpenCms log configuration
CmsParameterConfiguration configuration = new CmsParameterConfiguration(path);
// check if OpenCms should set the log file environment variable
boolean setLogFile = configuration.getBoolean("opencms.set.logfile", false);
if (setLogFile) {
// set "opencms.log" variable
String logFilePath = CmsFileUtil.normalizePath(webInfPath + FOLDER_LOGS + FILE_LOG, '/');
File logFile = new File(logFilePath);
m_logFileRfsPath = logFile.getAbsolutePath();
m_logFileRfsFolder = CmsFileUtil.normalizePath(logFile.getParent() + '/', File.separatorChar);
System.setProperty("opencms.logfile", m_logFileRfsPath);
System.setProperty("opencms.logfolder", m_logFileRfsFolder);
// re-read the configuration with the new environment variable available
PropertyConfigurator.configure(path);
}
}
// can't localize this message since this would end in an endless logger init loop
INIT.info(". Log4j config file : " + path);
}
} catch (SecurityException e) {
// ignore, may be caused if environment can't be written
} catch (Exception e) {
// unexpected but nothing we can do about it, print stack trace and continue
e.printStackTrace(System.err);
}
}
/**
* Returns the log for the selected object.<p>
*
* If the provided object is a String, this String will
* be used as channel name. Otherwise the objects
* class name will be used as channel name.<p>
*
* @param obj the object channel to use
* @return the log for the selected object channel
*/
public static Log getLog(Object obj) {
if (obj instanceof String) {
return LogFactory.getLog((String)obj);
} else if (obj instanceof Class<?>) {
return LogFactory.getLog((Class<?>)obj);
} else {
return LogFactory.getLog(obj.getClass());
}
}
/**
* Returns the filename of the log file (in the "real" file system).<p>
*
* If the method returns <code>null</code>, this means that the log
* file is not managed by OpenCms.<p>
*
* @return the filename of the log file (in the "real" file system)
*/
protected static String getLogFileRfsPath() {
return m_logFileRfsPath;
}
}