SimpleLog.java revision 31212435723e2dfd5d6716d1f6a7b0e66a1e6b38
1054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu/* 2054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * Copyright 2001-2004 The Apache Software Foundation. 37ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * 4054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * Licensed under the Apache License, Version 2.0 (the "License"); 5054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * you may not use this file except in compliance with the License. 6054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * You may obtain a copy of the License at 77ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * 8054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * http://www.apache.org/licenses/LICENSE-2.0 97ba0605dc97fb81bde8311510d27b3ccba170008Ceki Gulcu * 10054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * Unless required by applicable law or agreed to in writing, software 11054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * distributed under the License is distributed on an "AS IS" BASIS, 12054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * See the License for the specific language governing permissions and 14054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu * limitations under the License. 159a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu */ 16054ed393bd95a6f7c34398accc5cefe36fae8989Ceki Gulcu 17a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcupackage org.apache.commons.logging.impl; 18a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 19a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.io.InputStream; 20a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.io.Serializable; 21a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.lang.reflect.InvocationTargetException; 22a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.lang.reflect.Method; 23a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.security.AccessController; 24a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.security.PrivilegedAction; 25a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.text.DateFormat; 26a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.text.SimpleDateFormat; 27a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.util.Date; 28a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport java.util.Properties; 29a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 30a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport org.apache.commons.logging.Log; 31a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcuimport org.apache.commons.logging.LogConfigurationException; 32a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 33a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu/** 349a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * <p> 359a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * Simple implementation of Log that sends all enabled log messages, for all 369a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * defined loggers, to System.err. The following system properties are supported 379a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * to configure the behavior of this logger: 389a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * </p> 39a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * <ul> 409f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <li><code>org.apache.commons.logging.simplelog.defaultlog</code> - Default 419f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * logging detail level for all instances of SimpleLog. Must be one of ("trace", 429a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * "debug", "info", "warn", "error", or "fatal"). If not specified, defaults to 439a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * "info".</li> 449f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <li><code>org.apache.commons.logging.simplelog.log.xxxxx</code> - Logging 459a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * detail level for a SimpleLog instance named "xxxxx". Must be one of ("trace", 469a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * "debug", "info", "warn", "error", or "fatal"). If not specified, the default 479f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * logging detail level is used.</li> 489f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <li><code>org.apache.commons.logging.simplelog.showlogname</code> - Set to 499a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * <code>true</code> if you want the Log instance name to be included in output 509a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * messages. Defaults to <code>false</code>.</li> 519f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <li><code>org.apache.commons.logging.simplelog.showShortLogname</code> - Set 529a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * to <code>true</code> if you want the last component of the name to be 539a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * included in output messages. Defaults to <code>true</code>.</li> 549f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <li><code>org.apache.commons.logging.simplelog.showdatetime</code> - Set to 559a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * <code>true</code> if you want the current date and time to be included in 569a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * output messages. Default is <code>false</code>.</li> 579f10490a05f7344f4b3ef657e8991f5d51934e2fCeki Gulcu * <li><code>org.apache.commons.logging.simplelog.dateTimeFormat</code> - The 589a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * date and time format to be used in the output messages. The pattern 599a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * describing the date and time format is the same that is used in 609a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * <code>java.text.SimpleDateFormat</code>. If the format is not specified or is 619a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * invalid, the default format is used. The default format is 629a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * <code>yyyy/MM/dd HH:mm:ss:SSS zzz</code>.</li> 63a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * </ul> 649a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * 659a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * <p> 669a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * In addition to looking for system properties with the names specified above, 679a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * this implementation also checks for a class loader resource named 68a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * <code>"simplelog.properties"</code>, and includes any matching definitions 699a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * from this resource (if it exists). 709a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * </p> 719a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * 72a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * @author <a href="mailto:sanders@apache.org">Scott Sanders</a> 73a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * @author Rod Waldhoff 74a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * @author Robert Burrell Donkin 759a7a3a320cfa0c3325d6f08778783c40e0b48f3dCeki Gulcu * 76a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu * @version $Id: SimpleLog.java,v 1.21 2004/06/06 20:47:56 rdonkin Exp $ 77a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu */ 78a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcupublic class SimpleLog implements Log, Serializable { 79a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 8031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private static final long serialVersionUID = 136942970684951178L; 8131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 8231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // ------------------------------------------------------- Class Attributes 8331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 8431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** All system properties used by <code>SimpleLog</code> start with this */ 8531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected final String systemPrefix = "org.apache.commons.logging.simplelog."; 8631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 8731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** Properties loaded from simplelog.properties */ 8831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected final Properties simpleLogProps = new Properties(); 8931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 9031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** The default format to use when formating dates */ 9131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected final String DEFAULT_DATE_TIME_FORMAT = "yyyy/MM/dd HH:mm:ss:SSS zzz"; 9231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 9331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** Include the instance name in the log message? */ 9431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected boolean showLogName = false; 9531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 9631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Include the short name ( last component ) of the logger in the log message. 9731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Defaults to true - otherwise we'll be lost in a flood of messages without 9831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * knowing who sends them. 9931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 10031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected boolean showShortName = true; 10131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** Include the current time in the log message */ 10231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected boolean showDateTime = false; 10331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** The date and time format to use in the log message */ 10431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected String dateTimeFormat = DEFAULT_DATE_TIME_FORMAT; 10531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** Used to format times */ 10631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static protected DateFormat dateFormatter = null; 10731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 10831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // ---------------------------------------------------- Log Level Constants 10931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 11031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** "Trace" level logging. */ 11131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_TRACE = 1; 11231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** "Debug" level logging. */ 11331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_DEBUG = 2; 11431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** "Info" level logging. */ 11531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_INFO = 3; 11631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** "Warn" level logging. */ 11731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_WARN = 4; 11831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** "Error" level logging. */ 11931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_ERROR = 5; 12031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** "Fatal" level logging. */ 12131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_FATAL = 6; 12231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 12331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** Enable all logging levels */ 12431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_ALL = (LOG_LEVEL_TRACE - 1); 12531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 12631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** Enable no logging levels */ 12731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public static final int LOG_LEVEL_OFF = (LOG_LEVEL_FATAL + 1); 12831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 12931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // ------------------------------------------------------------ Initializer 13031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 13131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private static String getStringProperty(String name) { 13231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu String prop = null; 13331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu try { 13431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu prop = System.getProperty(name); 13531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } catch (SecurityException e) { 13631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu ; // Ignore 13731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 13831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return (prop == null) ? simpleLogProps.getProperty(name) : prop; 139a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 14031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 14131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private static String getStringProperty(String name, String dephault) { 14231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu String prop = getStringProperty(name); 14331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return (prop == null) ? dephault : prop; 144a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 145a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 14631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private static boolean getBooleanProperty(String name, boolean dephault) { 14731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu String prop = getStringProperty(name); 14831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return (prop == null) ? dephault : "true".equalsIgnoreCase(prop); 14931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 15031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 15131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Initialize class attributes. 15231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Load properties file, if found. 15331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Override with system properties. 15431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu static { 15531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Add props from the resource simplelog.properties 15631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu InputStream in = getResourceAsStream("simplelog.properties"); 15731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (null != in) { 15831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu try { 15931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu simpleLogProps.load(in); 16031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu in.close(); 16131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } catch (java.io.IOException e) { 16231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // ignored 16331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 16431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 16531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 16631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu showLogName = getBooleanProperty(systemPrefix + "showlogname", showLogName); 16731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu showShortName = getBooleanProperty(systemPrefix + "showShortLogname", showShortName); 16831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu showDateTime = getBooleanProperty(systemPrefix + "showdatetime", showDateTime); 16931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 17031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (showDateTime) { 17131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu dateTimeFormat = getStringProperty(systemPrefix + "dateTimeFormat", dateTimeFormat); 17231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu try { 17331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu dateFormatter = new SimpleDateFormat(dateTimeFormat); 17431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } catch (IllegalArgumentException e) { 17531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // If the format pattern is invalid - use the default format 17631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu dateTimeFormat = DEFAULT_DATE_TIME_FORMAT; 17731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu dateFormatter = new SimpleDateFormat(dateTimeFormat); 17831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 17931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 180a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 18131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 18231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // ------------------------------------------------------------- Attributes 18331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 18431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** The name of this simple log instance */ 18531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu protected String logName = null; 18631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** The current log level */ 18731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu protected int currentLogLevel; 18831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** The short name of this simple log instance */ 18931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private String shortLogName = null; 19031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 19131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // ------------------------------------------------------------ Constructor 19231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 19331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 19431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Construct a simple log with given name. 19531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 19631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param name 19731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * log name 19831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 19931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public SimpleLog(String name) { 20031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 20131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu logName = name; 20231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 20331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Set initial log level 20431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Used to be: set default log level to ERROR 20531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // IMHO it should be lower, but at least info ( costin ). 20631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_INFO); 20731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 20831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Set log level from properties 20931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu String lvl = getStringProperty(systemPrefix + "log." + logName); 21031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu int i = String.valueOf(name).lastIndexOf("."); 21131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu while (null == lvl && i > -1) { 21231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu name = name.substring(0, i); 21331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu lvl = getStringProperty(systemPrefix + "log." + name); 21431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu i = String.valueOf(name).lastIndexOf("."); 21531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 21631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 21731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (null == lvl) { 21831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu lvl = getStringProperty(systemPrefix + "defaultlog"); 21931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 22031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 22131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if ("all".equalsIgnoreCase(lvl)) { 22231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_ALL); 22331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("trace".equalsIgnoreCase(lvl)) { 22431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_TRACE); 22531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("debug".equalsIgnoreCase(lvl)) { 22631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_DEBUG); 22731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("info".equalsIgnoreCase(lvl)) { 22831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_INFO); 22931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("warn".equalsIgnoreCase(lvl)) { 23031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_WARN); 23131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("error".equalsIgnoreCase(lvl)) { 23231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_ERROR); 23331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("fatal".equalsIgnoreCase(lvl)) { 23431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_FATAL); 23531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if ("off".equalsIgnoreCase(lvl)) { 23631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu setLevel(SimpleLog.LOG_LEVEL_OFF); 23731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 23831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 239a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 240a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 24131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // -------------------------------------------------------- Properties 24231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 24331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 24431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 24531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Set logging level. 24631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 24731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 24831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param currentLogLevel 24931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * new logging level 25031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 25131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public void setLevel(int currentLogLevel) { 25231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 25331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu this.currentLogLevel = currentLogLevel; 25431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 255a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 256a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 25731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 25831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 25931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Get logging level. 26031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 26131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 26231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public int getLevel() { 26331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 26431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return currentLogLevel; 265a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 266a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 26731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // -------------------------------------------------------- Logging Methods 26831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 26931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 27031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 27131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Do the actual logging. This method assembles the message and then calls 27231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <code>write()</code> to cause it to be written. 27331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 27431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 27531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param type 27631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * One of the LOG_LEVEL_XXX constants defining the log level 27731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param message 27831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * The message itself (typically a String) 27931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param t 28031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * The exception whose stack trace should be logged 28131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 28231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu protected void log(int type, Object message, Throwable t) { 28331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Use a string buffer for better performance 28431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu StringBuffer buf = new StringBuffer(); 28531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 28631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Append date-time if so configured 28731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (showDateTime) { 28831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(dateFormatter.format(new Date())); 28931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(" "); 29031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 29131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 29231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Append a readable representation of the log level 29331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu switch (type) { 29431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case SimpleLog.LOG_LEVEL_TRACE: 29531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append("[TRACE] "); 29631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu break; 29731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case SimpleLog.LOG_LEVEL_DEBUG: 29831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append("[DEBUG] "); 29931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu break; 30031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case SimpleLog.LOG_LEVEL_INFO: 30131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append("[INFO] "); 30231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu break; 30331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case SimpleLog.LOG_LEVEL_WARN: 30431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append("[WARN] "); 30531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu break; 30631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case SimpleLog.LOG_LEVEL_ERROR: 30731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append("[ERROR] "); 30831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu break; 30931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu case SimpleLog.LOG_LEVEL_FATAL: 31031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append("[FATAL] "); 31131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu break; 31231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 31331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 31431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Append the name of the log instance if so configured 31531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (showShortName) { 31631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (shortLogName == null) { 31731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Cut all but the last component of the name for both styles 31831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu shortLogName = logName.substring(logName.lastIndexOf(".") + 1); 31931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu shortLogName = shortLogName.substring(shortLogName.lastIndexOf("/") + 1); 32031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 32131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(String.valueOf(shortLogName)).append(" - "); 32231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else if (showLogName) { 32331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(String.valueOf(logName)).append(" - "); 32431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 32531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 32631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Append the message 32731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(String.valueOf(message)); 32831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 32931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Append stack trace if not null 33031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (t != null) { 33131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(" <"); 33231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(t.toString()); 33331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(">"); 33431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 33531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu java.io.StringWriter sw = new java.io.StringWriter(1024); 33631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu java.io.PrintWriter pw = new java.io.PrintWriter(sw); 33731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu t.printStackTrace(pw); 33831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu pw.close(); 33931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu buf.append(sw.toString()); 34031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 34131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 34231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Print to the appropriate destination 34331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu write(buf); 34431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 345a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 346a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 34731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 34831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 34931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Write the content of the message accumulated in the specified 35031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <code>StringBuffer</code> to the appropriate output destination. The 35131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * default implementation writes to <code>System.err</code>. 35231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 35331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 35431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param buffer 35531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * A <code>StringBuffer</code> containing the accumulated text to be 35631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * logged 35731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 35831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu protected void write(StringBuffer buffer) { 35931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 36031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu System.err.println(buffer.toString()); 36131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 362a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 363a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 36431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 36531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Is the given log level currently enabled? 36631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 36731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @param logLevel 36831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * is this level enabled? 36931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 37031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu protected boolean isLevelEnabled(int logLevel) { 37131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // log level are numerically ordered so can use simple numeric 37231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // comparison 37331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return (logLevel >= currentLogLevel); 374a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 375a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 37631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // -------------------------------------------------------- Log Implementation 377a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 37831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 37931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 38031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log a message with debug log level. 38131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 38231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 38331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void debug(Object message) { 384a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 38531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG)) { 38631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_DEBUG, message, null); 38731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 388a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 389a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 39031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 39131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 39231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log an error with debug log level. 39331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 39431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 39531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void debug(Object message, Throwable t) { 39631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 39731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG)) { 39831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_DEBUG, message, t); 39931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 400a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 401a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 40231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 40331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 40431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log a message with trace log level. 40531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 40631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 40731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void trace(Object message) { 408a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 40931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE)) { 41031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_TRACE, message, null); 41131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 412a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 413a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 41431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 41531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 41631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log an error with trace log level. 41731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 41831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 41931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void trace(Object message, Throwable t) { 420a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 42131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE)) { 42231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_TRACE, message, t); 42331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 424a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 425a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 42631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 42731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 42831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log a message with info log level. 42931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 43031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 43131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void info(Object message) { 432a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 43331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) { 43431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_INFO, message, null); 43531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 436a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 437a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 43831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 43931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 44031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log an error with info log level. 44131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 44231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 44331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void info(Object message, Throwable t) { 444a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 44531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_INFO)) { 44631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_INFO, message, t); 44731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 448a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 449a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 45031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 45131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 45231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log a message with warn log level. 45331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 45431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 45531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void warn(Object message) { 456a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 45731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_WARN)) { 45831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_WARN, message, null); 45931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 460a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 461a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 46231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 46331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 46431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log an error with warn log level. 46531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 46631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 46731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void warn(Object message, Throwable t) { 468a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 46931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_WARN)) { 47031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_WARN, message, t); 47131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 472a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 473a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 47431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 47531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 47631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log a message with error log level. 47731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 47831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 47931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void error(Object message) { 480a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 48131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR)) { 48231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_ERROR, message, null); 48331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 484a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 485a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 48631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 48731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 48831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log an error with error log level. 48931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 49031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 49131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void error(Object message, Throwable t) { 492a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 49331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR)) { 49431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_ERROR, message, t); 49531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 496a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 497a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 49831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 49931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 50031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log a message with fatal log level. 50131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 50231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 50331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void fatal(Object message) { 504a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 50531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL)) { 50631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_FATAL, message, null); 50731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 508a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 509a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 51031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 51131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 51231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Log an error with fatal log level. 51331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 51431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 51531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final void fatal(Object message, Throwable t) { 516a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 51731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL)) { 51831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu log(SimpleLog.LOG_LEVEL_FATAL, message, t); 51931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 520a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 521a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 52231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 52331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 52431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Are debug messages currently enabled? 52531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 52631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 52731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 52831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * This allows expensive operations such as <code>String</code> concatenation 52931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * to be avoided when the message will be ignored by the logger. 53031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 53131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 53231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final boolean isDebugEnabled() { 53331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 53431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return isLevelEnabled(SimpleLog.LOG_LEVEL_DEBUG); 53531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 536a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 53731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 53831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 53931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Are error messages currently enabled? 54031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 54131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 54231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 54331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * This allows expensive operations such as <code>String</code> concatenation 54431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * to be avoided when the message will be ignored by the logger. 54531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 54631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 54731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final boolean isErrorEnabled() { 54831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 54931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return isLevelEnabled(SimpleLog.LOG_LEVEL_ERROR); 550a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 55131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 55231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 55331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 55431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Are fatal messages currently enabled? 55531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 55631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 55731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 55831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * This allows expensive operations such as <code>String</code> concatenation 55931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * to be avoided when the message will be ignored by the logger. 56031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 56131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 56231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final boolean isFatalEnabled() { 56331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 56431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return isLevelEnabled(SimpleLog.LOG_LEVEL_FATAL); 56531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 56631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 56731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 56831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 56931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Are info messages currently enabled? 57031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 57131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 57231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 57331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * This allows expensive operations such as <code>String</code> concatenation 57431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * to be avoided when the message will be ignored by the logger. 57531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 57631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 57731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final boolean isInfoEnabled() { 57831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 57931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return isLevelEnabled(SimpleLog.LOG_LEVEL_INFO); 580a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 581a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 58231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 58331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 58431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Are trace messages currently enabled? 58531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 58631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 58731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 58831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * This allows expensive operations such as <code>String</code> concatenation 58931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * to be avoided when the message will be ignored by the logger. 59031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 59131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 59231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final boolean isTraceEnabled() { 59331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 59431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return isLevelEnabled(SimpleLog.LOG_LEVEL_TRACE); 595a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 596a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 59731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 59831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 59931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Are warn messages currently enabled? 60031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 60131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 60231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * <p> 60331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * This allows expensive operations such as <code>String</code> concatenation 60431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * to be avoided when the message will be ignored by the logger. 60531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * </p> 60631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 60731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public final boolean isWarnEnabled() { 60831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 60931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return isLevelEnabled(SimpleLog.LOG_LEVEL_WARN); 61031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 611a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 61231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 61331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * Return the thread context class loader if available. Otherwise return null. 61431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 61531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * The thread context class loader is available for JDK 1.2 or later, if 61631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * certain security conditions are met. 61731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 61831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * @exception LogConfigurationException 61931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * if a suitable class loader cannot be identified. 62031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 62131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private static ClassLoader getContextClassLoader() { 62231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu ClassLoader classLoader = null; 62331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 62431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (classLoader == null) { 62531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu try { 62631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Are we running on a JDK 1.2 or later system? 62731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu Method method = Thread.class.getMethod("getContextClassLoader"); 62831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 62931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Get the thread context class loader (if there is one) 63031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu try { 63131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu classLoader = (ClassLoader) method.invoke(Thread.currentThread()); 63231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } catch (IllegalAccessException e) { 63331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu ; // ignore 63431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } catch (InvocationTargetException e) { 63531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu /** 63631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * InvocationTargetException is thrown by 'invoke' when the method 63731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * being invoked (getContextClassLoader) throws an exception. 63831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 63931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * getContextClassLoader() throws SecurityException when the context 64031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * class loader isn't an ancestor of the calling class's class loader, 64131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * or if security permissions are restricted. 64231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * 64331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * In the first case (not related), we want to ignore and keep going. 64431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * We cannot help but also ignore the second with the logic below, but 64531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * other calls elsewhere (to obtain a class loader) will trigger this 64631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu * exception where we can make a distinction. 64731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu */ 64831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (e.getTargetException() instanceof SecurityException) { 64931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu ; // ignore 65031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else { 65131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Capture 'e.getTargetException()' exception for details 65231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // alternate: log 'e.getTargetException()', and pass back 'e'. 65331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu throw new LogConfigurationException("Unexpected InvocationTargetException", e.getTargetException()); 65431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 65531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 65631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } catch (NoSuchMethodException e) { 65731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Assume we are running on JDK 1.1 65831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu ; // ignore 65931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 66031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 661a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu 66231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (classLoader == null) { 66331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu classLoader = SimpleLog.class.getClassLoader(); 664a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu } 66531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 66631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu // Return the selected class loader 66731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return classLoader; 66831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 66931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 67031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu private static InputStream getResourceAsStream(final String name) { 67131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return AccessController.doPrivileged(new PrivilegedAction<InputStream>() { 67231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu public InputStream run() { 67331212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu ClassLoader threadCL = getContextClassLoader(); 67431212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu 67531212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu if (threadCL != null) { 67631212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return threadCL.getResourceAsStream(name); 67731212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } else { 67831212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu return ClassLoader.getSystemResourceAsStream(name); 67931212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 68031212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 68131212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu }); 68231212435723e2dfd5d6716d1f6a7b0e66a1e6b38Ceki Gulcu } 683a03af842a5041f5b1595d88429f993671bc5f431Ceki Gulcu} 684