001: /*
002: * File : $Source: /usr/local/cvs/opencms/src/org/opencms/main/CmsLog.java,v $
003: * Date : $Date: 2008-02-27 12:05:39 $
004: * Version: $Revision: 1.28 $
005: *
006: * This library is part of OpenCms -
007: * the Open Source Content Management System
008: *
009: * Copyright (c) 2002 - 2008 Alkacon Software GmbH (http://www.alkacon.com)
010: *
011: * This library is free software; you can redistribute it and/or
012: * modify it under the terms of the GNU Lesser General Public
013: * License as published by the Free Software Foundation; either
014: * version 2.1 of the License, or (at your option) any later version.
015: *
016: * This library is distributed in the hope that it will be useful,
017: * but WITHOUT ANY WARRANTY; without even the implied warranty of
018: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: * Lesser General Public License for more details.
020: *
021: * For further information about Alkacon Software GmbH, please see the
022: * company website: http://www.alkacon.com
023: *
024: * For further information about OpenCms, please see the
025: * project website: http://www.opencms.org
026: *
027: * You should have received a copy of the GNU Lesser General Public
028: * License along with this library; if not, write to the Free Software
029: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
030: */
031:
032: package org.opencms.main;
033:
034: import org.opencms.configuration.CmsConfigurationManager;
035: import org.opencms.file.CmsResource;
036: import org.opencms.util.CmsFileUtil;
037:
038: import java.io.File;
039: import java.net.URL;
040:
041: import org.apache.commons.collections.ExtendedProperties;
042: import org.apache.commons.logging.Log;
043: import org.apache.commons.logging.LogFactory;
044: import org.apache.log4j.PropertyConfigurator;
045: import org.apache.log4j.helpers.Loader;
046:
047: /**
048: * Provides the OpenCms logging mechanism.<p>
049: *
050: * The OpenCms logging mechanism is based on Apache Commons Logging.
051: * However, log4j is shipped with OpenCms and assumed to be used as default logging mechanism.
052: * Since apparently Commons Logging may cause issues in more complex classloader scenarios,
053: * we may switch the logging interface to log4j <code>UGLI</code> once the final release is available.<p>
054: *
055: * The log4j configuration file shipped with OpenCms is located
056: * in <code>${opencms.WEB-INF}/classes/log4j.properties</code>. OpenCms will auto-configure itself
057: * to write it's log file to <code>${opencms.WEB-INF}/logs/opencms.log</code>. This default behaviour
058: * can be supressed by either using a log4j configuration file from another location, or by setting the
059: * special property <code>${opencms.set.logfile}</code> in the log4j configuration file to <code>false</code>.
060: *
061: * @author Alexander Kandzior
062: *
063: * @version $Revision: 1.28 $
064: *
065: * @since 6.0.0
066: */
067: public final class CmsLog {
068:
069: /** The name of the opencms.log file. */
070: public static final String FILE_LOG = "opencms.log";
071:
072: /** Path to the "logs" folder relative to the "WEB-INF" directory of the application. */
073: public static final String FOLDER_LOGS = "logs"
074: + File.separatorChar;
075:
076: /** Log for initialization messages. */
077: public static final Log INIT = LogFactory
078: .getLog("org.opencms.init");
079:
080: /** The abolute path to the OpenCms log file (in the "real" file system). */
081: private static String m_logFileRfsPath;
082:
083: /**
084: * Hides the public constructor.<p>
085: */
086: private CmsLog() {
087:
088: // hides the public constructor
089: }
090:
091: /**
092: * Initializes the OpenCms logger configuration.<p>
093: */
094: static {
095: try {
096: // look for the log4j.properties that shipped with OpenCms
097: URL url = Loader.getResource("log4j.properties");
098: if (url != null) {
099: // found some log4j properties, let's see if these are the ones used by OpenCms
100: String path = CmsFileUtil.normalizePath(url, '/');
101: // in a default OpenCms configuration, the following path would point to the OpenCms "WEB-INF" folder
102: String webInfPath = CmsResource
103: .getParentFolder(CmsResource
104: .getFolderPath(path));
105: // check for the OpenCms configuration file
106: String configFilePath = webInfPath
107: + CmsSystemInfo.FOLDER_CONFIG
108: + CmsConfigurationManager.DEFAULT_XML_FILE_NAME;
109: File configFile = new File(configFilePath);
110: if (configFile.exists()) {
111: // assume this is a default OpenCms log configuration
112: ExtendedProperties configuration = new ExtendedProperties(
113: path);
114: // check if OpenCms should set the log file environment variable
115: boolean setLogFile = configuration.getBoolean(
116: "opencms.set.logfile", false);
117: if (setLogFile) {
118: // set "opencms.log" variable
119: String logFilePath = CmsFileUtil.normalizePath(
120: webInfPath + FOLDER_LOGS + FILE_LOG,
121: '/');
122: File logFile = new File(logFilePath);
123: m_logFileRfsPath = logFile.getAbsolutePath();
124: System.setProperty("opencms.logfile",
125: m_logFileRfsPath);
126: // re-read the configuration with the new environment variable available
127: PropertyConfigurator.configure(path);
128: }
129: }
130: // can't localize this message since this would end in an endless logger init loop
131: INIT.info(". Log4j config file : " + path);
132: }
133: } catch (SecurityException e) {
134: // ignore, may be caused if environment can't be written
135: } catch (Exception e) {
136: // unexpected but nothing we can do about it, print stack trace and continue
137: e.printStackTrace(System.err);
138: }
139: }
140:
141: /**
142: * Returns the log for the selected object.<p>
143: *
144: * If the provided object is a String, this String will
145: * be used as channel name. Otherwise the objects
146: * class name will be used as channel name.<p>
147: *
148: * @param obj the object channel to use
149: * @return the log for the selected object channel
150: */
151: public static Log getLog(Object obj) {
152:
153: if (obj instanceof String) {
154: return LogFactory.getLog((String) obj);
155: } else if (obj instanceof Class) {
156: return LogFactory.getLog((Class) obj);
157: } else {
158: return LogFactory.getLog(obj.getClass());
159: }
160: }
161:
162: /**
163: * Returns the filename of the logfile (in the "real" file system).<p>
164: *
165: * If the method returns <code>null</code>, this means that the log
166: * file is not managed by OpenCms.<p>
167: *
168: * @return the filename of the logfile (in the "real" file system)
169: */
170: protected static String getLogFileRfsPath() {
171:
172: return m_logFileRfsPath;
173: }
174: }
|