001: //** Copyright Statement ***************************************************
002: //The Salmon Open Framework for Internet Applications (SOFIA)
003: // Copyright (C) 1999 - 2002, Salmon LLC
004: //
005: // This program is free software; you can redistribute it and/or
006: // modify it under the terms of the GNU General Public License version 2
007: // as published by the Free Software Foundation;
008: //
009: // This program is distributed in the hope that it will be useful,
010: // but WITHOUT ANY WARRANTY; without even the implied warranty of
011: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: // GNU General Public License for more details.
013: //
014: // You should have received a copy of the GNU General Public License
015: // along with this program; if not, write to the Free Software
016: // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
017: //
018: // For more information please visit http://www.salmonllc.com
019: //** End Copyright Statement ***************************************************
020: package com.salmonllc.util;
021:
022: import org.apache.log4j.PropertyConfigurator;
023: import org.apache.log4j.xml.DOMConfigurator;
024:
025: import com.salmonllc.properties.Props;
026: import com.salmonllc.sql.DBStatement;
027:
028: /**
029: * Concrete implementation of the logger class that logs using the Log4J<br>
030: * To have the framework use Log4J instead of SOFIA standard:<br>
031: * 1) Make sure the log4J jar is in your class path.<br>
032: * 2) Import this class into the com.salmonllc.util package<br>
033: * 3) Set the property in your System.properties: MessageLogLoggerClass=com.salmonllc.util.LoggerLog4J<br>
034: * 4) Optional, if you want to have log4J use something other then the default configuration set the property in your System.properties: MessageLogLoggerConfigFile=Log4J Config File (see the docs on Log4J for information on what to put in this file)
035: */
036:
037: public class LoggerLog4J implements com.salmonllc.util.Logger {
038:
039: /**
040: * Log a message to the appropriate message logging package
041: * @param message The message to log
042: * @param type The type, see TYPE constants at the top of the page
043: * @param level The error level
044: * @param e an error message
045: * @param o the object logging the message
046: */
047:
048: private org.apache.log4j.Logger[] _typeToLoggerMap = new org.apache.log4j.Logger[5];
049: private org.apache.log4j.Priority[] _typeToLevelMap = new org.apache.log4j.Priority[5];
050:
051: public LoggerLog4J() {
052:
053: //Check the System.properties file to see if we should configure the logger
054: Props p = Props.getSystemProps();
055: String configFile = p
056: .getProperty(Props.SYS_MESSAGELOG_LOGGER_CONFIG_FILE);
057: if (configFile != null) {
058: if (configFile.toUpperCase().endsWith(".XML"))
059: DOMConfigurator.configure(configFile);
060: else
061: PropertyConfigurator.configure(configFile);
062: }
063:
064: //set up mappings between SOFIA Message Log calls and Log4J calls
065: _typeToLoggerMap[TYPE_ASSERTION] = org.apache.log4j.Logger
066: .getLogger("com.salmonllc.util.MessageLog.Assertion");
067: _typeToLoggerMap[TYPE_ERROR] = org.apache.log4j.Logger
068: .getLogger("com.salmonllc.util.MessageLog.Error");
069: _typeToLoggerMap[TYPE_INFO] = org.apache.log4j.Logger
070: .getLogger("com.salmonllc.util.MessageLog.Info");
071: _typeToLoggerMap[TYPE_SQL] = org.apache.log4j.Logger
072: .getLogger("com.salmonllc.util.MessageLog.SQL");
073: _typeToLoggerMap[TYPE_DEBUG] = org.apache.log4j.Logger
074: .getLogger("com.salmonllc.util.MessageLog.Debug");
075:
076: _typeToLevelMap[TYPE_ASSERTION] = org.apache.log4j.Priority.ERROR;
077: _typeToLevelMap[TYPE_ERROR] = org.apache.log4j.Priority.ERROR;
078: _typeToLevelMap[TYPE_INFO] = org.apache.log4j.Priority.INFO;
079: _typeToLevelMap[TYPE_SQL] = org.apache.log4j.Priority.INFO;
080: _typeToLevelMap[TYPE_DEBUG] = org.apache.log4j.Priority.DEBUG;
081: }
082:
083: public void log(String message, int type, int level, Throwable e,
084: Object o) {
085: org.apache.log4j.Logger logger = _typeToLoggerMap[type];
086: org.apache.log4j.Priority priority = _typeToLevelMap[type];
087:
088: if (logger.isEnabledFor(priority)) {
089: //find the calling class
090: Throwable dummyException = new Throwable();
091: StackTraceElement locations[] = dummyException
092: .getStackTrace();
093: String cName = MessageLog.class.getName();
094: if (locations != null) {
095: String className = DBStatement.class.getName();
096: for (int i = 0; i < locations.length; i++) {
097: if (className.indexOf(locations[i].getClassName()) != -1) {
098: cName = locations[i].getClassName();
099: break;
100: }
101: }
102: }
103: //call the log4J logger
104: logger.log(cName, priority, message, e);
105: }
106: }
107: }
|