From dd7ec6b31e6235b73a80a231bf4a3236da4f866c Mon Sep 17 00:00:00 2001
From: Jeremy Landis A simple implementation that delegates all log requests to the Google Android
- * logging facilities. Note that this logger does not support {@link org.slf4j.Marker}.
- * Methods taking marker data as parameter simply invoke the eponymous method
- * without the Marker argument, discarding any marker data in the process. The logging levels specified for SLF4J can be almost directly mapped to
- * the levels that exist in the Google Android platform. The following table
- * shows the mapping implemented by this logger. Use loggers as usual:
- *
- *
- *
- *
- * SLF4J Android
- * TRACE {@link android.util.Log#VERBOSE}
- * DEBUG {@link android.util.Log#DEBUG}
- * INFO {@link android.util.Log#INFO}
- * WARN {@link android.util.Log#WARN}
- * ERROR {@link android.util.Log#ERROR}
- *
- *
- * private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
- *
- * logger.debug("Some log message. Details: {}", someObject);
- * logger.debug("Some log message with varargs. Details: {}, {}, {}", someObject1, someObject2, someObject3);
- *
Logger instances created using the LoggerFactory are named either according to the name - * or the fully qualified class name of the class given as a parameter. - * Each logger name will be used as the log message tag on the Android platform. - * However, tag names cannot be longer than 23 characters so if logger name exceeds this limit then - * it will be truncated by the LoggerFactory. The following examples illustrate this. - *
| Original Name | Truncated Name |
|---|---|
| org.example.myproject.mypackage.MyClass | o*.e*.m*.m*.MyClass |
| o.e.myproject.mypackage.MyClass | o.e.m*.m*.MyClass |
| org.example.ThisNameIsWayTooLongAndWillBeTruncated | *LongAndWillBeTruncated |
| ThisNameIsWayTooLongAndWillBeTruncated | *LongAndWillBeTruncated |
- * This form avoids superfluous object creation when the logger is disabled - * for level VERBOSE. - *
- * - * @param format - * the format string - * @param arg - * the argument - */ - public void trace(String format, Object arg) { - formatAndLog(Log.VERBOSE, format, arg); - } - - /** - * Log a message at level VERBOSE according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the VERBOSE level. - *
- * - * @param format - * the format string - * @param arg1 - * the first argument - * @param arg2 - * the second argument - */ - public void trace(String format, Object arg1, Object arg2) { - formatAndLog(Log.VERBOSE, format, arg1, arg2); - } - - /** - * Log a message at level VERBOSE according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the VERBOSE level. - *
- * - * @param format - * the format string - * @param argArray - * an array of arguments - */ - public void trace(String format, Object... argArray) { - formatAndLog(Log.VERBOSE, format, argArray); - } - - /** - * Log an exception (throwable) at level VERBOSE with an accompanying message. - * - * @param msg - * the message accompanying the exception - * @param t - * the exception (throwable) to log - */ - public void trace(String msg, Throwable t) { - log(Log.VERBOSE, msg, t); - } - - /** - * Is this logger instance enabled for the DEBUG level? - * - * @return True if this Logger is enabled for level DEBUG, false otherwise. - */ - public boolean isDebugEnabled() { - return isLoggable(Log.DEBUG); - } - - /** - * Log a message object at level DEBUG. - * - * @param msg - * - the message object to be logged - */ - public void debug(String msg) { - log(Log.DEBUG, msg, null); - } - - /** - * Log a message at level DEBUG according to the specified format and argument. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for level DEBUG. - *
- * - * @param format - * the format string - * @param arg - * the argument - */ - public void debug(String format, Object arg) { - formatAndLog(Log.DEBUG, format, arg); - } - - /** - * Log a message at level DEBUG according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the DEBUG level. - *
- * - * @param format - * the format string - * @param arg1 - * the first argument - * @param arg2 - * the second argument - */ - public void debug(String format, Object arg1, Object arg2) { - formatAndLog(Log.DEBUG, format, arg1, arg2); - } - - /** - * Log a message at level DEBUG according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the DEBUG level. - *
- * - * @param format - * the format string - * @param argArray - * an array of arguments - */ - public void debug(String format, Object... argArray) { - formatAndLog(Log.DEBUG, format, argArray); - } - - /** - * Log an exception (throwable) at level DEBUG with an accompanying message. - * - * @param msg - * the message accompanying the exception - * @param t - * the exception (throwable) to log - */ - public void debug(String msg, Throwable t) { - log(Log.VERBOSE, msg, t); - } - - /** - * Is this logger instance enabled for the INFO level? - * - * @return True if this Logger is enabled for the INFO level, false otherwise. - */ - public boolean isInfoEnabled() { - return isLoggable(Log.INFO); - } - - /** - * Log a message object at the INFO level. - * - * @param msg - * - the message object to be logged - */ - public void info(String msg) { - log(Log.INFO, msg, null); - } - - /** - * Log a message at level INFO according to the specified format and argument. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the INFO level. - *
- * - * @param format - * the format string - * @param arg - * the argument - */ - public void info(String format, Object arg) { - formatAndLog(Log.INFO, format, arg); - } - - /** - * Log a message at the INFO level according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the INFO level. - *
- * - * @param format - * the format string - * @param arg1 - * the first argument - * @param arg2 - * the second argument - */ - public void info(String format, Object arg1, Object arg2) { - formatAndLog(Log.INFO, format, arg1, arg2); - } - - /** - * Log a message at level INFO according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the INFO level. - *
- * - * @param format - * the format string - * @param argArray - * an array of arguments - */ - public void info(String format, Object... argArray) { - formatAndLog(Log.INFO, format, argArray); - } - - /** - * Log an exception (throwable) at the INFO level with an accompanying - * message. - * - * @param msg - * the message accompanying the exception - * @param t - * the exception (throwable) to log - */ - public void info(String msg, Throwable t) { - log(Log.INFO, msg, t); - } - - /** - * Is this logger instance enabled for the WARN level? - * - * @return True if this Logger is enabled for the WARN level, false - * otherwise. - */ - public boolean isWarnEnabled() { - return isLoggable(Log.WARN); - } - - /** - * Log a message object at the WARN level. - * - * @param msg - * - the message object to be logged - */ - public void warn(String msg) { - log(Log.WARN, msg, null); - } - - /** - * Log a message at the WARN level according to the specified format and - * argument. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the WARN level. - *
- * - * @param format - * the format string - * @param arg - * the argument - */ - public void warn(String format, Object arg) { - formatAndLog(Log.WARN, format, arg); - } - - /** - * Log a message at the WARN level according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the WARN level. - *
- * - * @param format - * the format string - * @param arg1 - * the first argument - * @param arg2 - * the second argument - */ - public void warn(String format, Object arg1, Object arg2) { - formatAndLog(Log.WARN, format, arg1, arg2); - } - - /** - * Log a message at level WARN according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the WARN level. - *
- * - * @param format - * the format string - * @param argArray - * an array of arguments - */ - public void warn(String format, Object... argArray) { - formatAndLog(Log.WARN, format, argArray); - } - - /** - * Log an exception (throwable) at the WARN level with an accompanying - * message. - * - * @param msg - * the message accompanying the exception - * @param t - * the exception (throwable) to log - */ - public void warn(String msg, Throwable t) { - log(Log.WARN, msg, t); - } - - /** - * Is this logger instance enabled for level ERROR? - * - * @return True if this Logger is enabled for level ERROR, false otherwise. - */ - public boolean isErrorEnabled() { - return isLoggable(Log.ERROR); - } - - /** - * Log a message object at the ERROR level. - * - * @param msg - * - the message object to be logged - */ - public void error(String msg) { - log(Log.ERROR, msg, null); - } - - /** - * Log a message at the ERROR level according to the specified format and - * argument. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the ERROR level. - *
- * - * @param format - * the format string - * @param arg - * the argument - */ - public void error(String format, Object arg) { - formatAndLog(Log.ERROR, format, arg); - } - - /** - * Log a message at the ERROR level according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the ERROR level. - *
- * - * @param format - * the format string - * @param arg1 - * the first argument - * @param arg2 - * the second argument - */ - public void error(String format, Object arg1, Object arg2) { - formatAndLog(Log.ERROR, format, arg1, arg2); - } - - /** - * Log a message at level ERROR according to the specified format and - * arguments. - * - *- * This form avoids superfluous object creation when the logger is disabled - * for the ERROR level. - *
- * - * @param format - * the format string - * @param argArray - * an array of arguments - */ - public void error(String format, Object... argArray) { - formatAndLog(Log.ERROR, format, argArray); - } - - /** - * Log an exception (throwable) at the ERROR level with an accompanying - * message. - * - * @param msg - * the message accompanying the exception - * @param t - * the exception (throwable) to log - */ - public void error(String msg, Throwable t) { - log(Log.ERROR, msg, t); - } - - private void formatAndLog(int priority, String format, Object... argArray) { - if (isLoggable(priority)) { - FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray); - _log(priority, ft.getMessage(), ft.getThrowable()); - } - } - - private void log(int priority, String message, Throwable throwable) { - if (isLoggable(priority)) { - _log(priority, message, throwable); - } - } - - private boolean isLoggable(int priority) { - return Log.isLoggable(name, priority); - } - - private void _log(int priority, String message, Throwable throwable) { - if (throwable != null) { - message += '\n' + Log.getStackTraceString(throwable); - } - Log.println(priority, name, message); - } +/* + * Copyright (c) 2004-2013 QOS.ch + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package org.slf4j.impl; + +import android.util.Log; +import org.slf4j.helpers.FormattingTuple; +import org.slf4j.helpers.MarkerIgnoringBase; +import org.slf4j.helpers.MessageFormatter; + +/** + *A simple implementation that delegates all log requests to the Google Android + * logging facilities. Note that this logger does not support {@link org.slf4j.Marker}. + * Methods taking marker data as parameter simply invoke the eponymous method + * without the Marker argument, discarding any marker data in the process.
+ * + *The logging levels specified for SLF4J can be almost directly mapped to + * the levels that exist in the Google Android platform. The following table + * shows the mapping implemented by this logger.
+ * + *| SLF4J | Android |
|---|---|
| TRACE | {@link android.util.Log#VERBOSE} |
| DEBUG | {@link android.util.Log#DEBUG} |
| INFO | {@link android.util.Log#INFO} |
| WARN | {@link android.util.Log#WARN} |
| ERROR | {@link android.util.Log#ERROR} |
Use loggers as usual: + *
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
+ * logger.debug("Some log message. Details: {}", someObject);logger.debug("Some log message with varargs. Details: {}, {}, {}", someObject1, someObject2, someObject3);
+ * Logger instances created using the LoggerFactory are named either according to the name + * or the fully qualified class name of the class given as a parameter. + * Each logger name will be used as the log message tag on the Android platform. + * However, tag names cannot be longer than 23 characters so if logger name exceeds this limit then + * it will be truncated by the LoggerFactory. The following examples illustrate this. + *
| Original Name | Truncated Name |
|---|---|
| org.example.myproject.mypackage.MyClass | o*.e*.m*.m*.MyClass |
| o.e.myproject.mypackage.MyClass | o.e.m*.m*.MyClass |
| org.example.ThisNameIsWayTooLongAndWillBeTruncated | *LongAndWillBeTruncated |
| ThisNameIsWayTooLongAndWillBeTruncated | *LongAndWillBeTruncated |
+ * This form avoids superfluous object creation when the logger is disabled + * for level VERBOSE. + *
+ * + * @param format + * the format string + * @param arg + * the argument + */ + public void trace(String format, Object arg) { + formatAndLog(Log.VERBOSE, format, arg); + } + + /** + * Log a message at level VERBOSE according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the VERBOSE level. + *
+ * + * @param format + * the format string + * @param arg1 + * the first argument + * @param arg2 + * the second argument + */ + public void trace(String format, Object arg1, Object arg2) { + formatAndLog(Log.VERBOSE, format, arg1, arg2); + } + + /** + * Log a message at level VERBOSE according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the VERBOSE level. + *
+ * + * @param format + * the format string + * @param argArray + * an array of arguments + */ + public void trace(String format, Object... argArray) { + formatAndLog(Log.VERBOSE, format, argArray); + } + + /** + * Log an exception (throwable) at level VERBOSE with an accompanying message. + * + * @param msg + * the message accompanying the exception + * @param t + * the exception (throwable) to log + */ + public void trace(String msg, Throwable t) { + log(Log.VERBOSE, msg, t); + } + + /** + * Is this logger instance enabled for the DEBUG level? + * + * @return True if this Logger is enabled for level DEBUG, false otherwise. + */ + public boolean isDebugEnabled() { + return isLoggable(Log.DEBUG); + } + + /** + * Log a message object at level DEBUG. + * + * @param msg + * - the message object to be logged + */ + public void debug(String msg) { + log(Log.DEBUG, msg, null); + } + + /** + * Log a message at level DEBUG according to the specified format and argument. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for level DEBUG. + *
+ * + * @param format + * the format string + * @param arg + * the argument + */ + public void debug(String format, Object arg) { + formatAndLog(Log.DEBUG, format, arg); + } + + /** + * Log a message at level DEBUG according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the DEBUG level. + *
+ * + * @param format + * the format string + * @param arg1 + * the first argument + * @param arg2 + * the second argument + */ + public void debug(String format, Object arg1, Object arg2) { + formatAndLog(Log.DEBUG, format, arg1, arg2); + } + + /** + * Log a message at level DEBUG according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the DEBUG level. + *
+ * + * @param format + * the format string + * @param argArray + * an array of arguments + */ + public void debug(String format, Object... argArray) { + formatAndLog(Log.DEBUG, format, argArray); + } + + /** + * Log an exception (throwable) at level DEBUG with an accompanying message. + * + * @param msg + * the message accompanying the exception + * @param t + * the exception (throwable) to log + */ + public void debug(String msg, Throwable t) { + log(Log.VERBOSE, msg, t); + } + + /** + * Is this logger instance enabled for the INFO level? + * + * @return True if this Logger is enabled for the INFO level, false otherwise. + */ + public boolean isInfoEnabled() { + return isLoggable(Log.INFO); + } + + /** + * Log a message object at the INFO level. + * + * @param msg + * - the message object to be logged + */ + public void info(String msg) { + log(Log.INFO, msg, null); + } + + /** + * Log a message at level INFO according to the specified format and argument. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the INFO level. + *
+ * + * @param format + * the format string + * @param arg + * the argument + */ + public void info(String format, Object arg) { + formatAndLog(Log.INFO, format, arg); + } + + /** + * Log a message at the INFO level according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the INFO level. + *
+ * + * @param format + * the format string + * @param arg1 + * the first argument + * @param arg2 + * the second argument + */ + public void info(String format, Object arg1, Object arg2) { + formatAndLog(Log.INFO, format, arg1, arg2); + } + + /** + * Log a message at level INFO according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the INFO level. + *
+ * + * @param format + * the format string + * @param argArray + * an array of arguments + */ + public void info(String format, Object... argArray) { + formatAndLog(Log.INFO, format, argArray); + } + + /** + * Log an exception (throwable) at the INFO level with an accompanying + * message. + * + * @param msg + * the message accompanying the exception + * @param t + * the exception (throwable) to log + */ + public void info(String msg, Throwable t) { + log(Log.INFO, msg, t); + } + + /** + * Is this logger instance enabled for the WARN level? + * + * @return True if this Logger is enabled for the WARN level, false + * otherwise. + */ + public boolean isWarnEnabled() { + return isLoggable(Log.WARN); + } + + /** + * Log a message object at the WARN level. + * + * @param msg + * - the message object to be logged + */ + public void warn(String msg) { + log(Log.WARN, msg, null); + } + + /** + * Log a message at the WARN level according to the specified format and + * argument. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the WARN level. + *
+ * + * @param format + * the format string + * @param arg + * the argument + */ + public void warn(String format, Object arg) { + formatAndLog(Log.WARN, format, arg); + } + + /** + * Log a message at the WARN level according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the WARN level. + *
+ * + * @param format + * the format string + * @param arg1 + * the first argument + * @param arg2 + * the second argument + */ + public void warn(String format, Object arg1, Object arg2) { + formatAndLog(Log.WARN, format, arg1, arg2); + } + + /** + * Log a message at level WARN according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the WARN level. + *
+ * + * @param format + * the format string + * @param argArray + * an array of arguments + */ + public void warn(String format, Object... argArray) { + formatAndLog(Log.WARN, format, argArray); + } + + /** + * Log an exception (throwable) at the WARN level with an accompanying + * message. + * + * @param msg + * the message accompanying the exception + * @param t + * the exception (throwable) to log + */ + public void warn(String msg, Throwable t) { + log(Log.WARN, msg, t); + } + + /** + * Is this logger instance enabled for level ERROR? + * + * @return True if this Logger is enabled for level ERROR, false otherwise. + */ + public boolean isErrorEnabled() { + return isLoggable(Log.ERROR); + } + + /** + * Log a message object at the ERROR level. + * + * @param msg + * - the message object to be logged + */ + public void error(String msg) { + log(Log.ERROR, msg, null); + } + + /** + * Log a message at the ERROR level according to the specified format and + * argument. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the ERROR level. + *
+ * + * @param format + * the format string + * @param arg + * the argument + */ + public void error(String format, Object arg) { + formatAndLog(Log.ERROR, format, arg); + } + + /** + * Log a message at the ERROR level according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the ERROR level. + *
+ * + * @param format + * the format string + * @param arg1 + * the first argument + * @param arg2 + * the second argument + */ + public void error(String format, Object arg1, Object arg2) { + formatAndLog(Log.ERROR, format, arg1, arg2); + } + + /** + * Log a message at level ERROR according to the specified format and + * arguments. + * + *+ * This form avoids superfluous object creation when the logger is disabled + * for the ERROR level. + *
+ * + * @param format + * the format string + * @param argArray + * an array of arguments + */ + public void error(String format, Object... argArray) { + formatAndLog(Log.ERROR, format, argArray); + } + + /** + * Log an exception (throwable) at the ERROR level with an accompanying + * message. + * + * @param msg + * the message accompanying the exception + * @param t + * the exception (throwable) to log + */ + public void error(String msg, Throwable t) { + log(Log.ERROR, msg, t); + } + + private void formatAndLog(int priority, String format, Object... argArray) { + if (isLoggable(priority)) { + FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray); + _log(priority, ft.getMessage(), ft.getThrowable()); + } + } + + private void log(int priority, String message, Throwable throwable) { + if (isLoggable(priority)) { + _log(priority, message, throwable); + } + } + + private boolean isLoggable(int priority) { + return Log.isLoggable(name, priority); + } + + private void _log(int priority, String message, Throwable throwable) { + if (throwable != null) { + message += '\n' + Log.getStackTraceString(throwable); + } + Log.println(priority, name, message); + } } \ No newline at end of file diff --git a/slf4j-android/src/main/java/org/slf4j/impl/AndroidLoggerFactory.java b/slf4j-android/src/main/java/org/slf4j/impl/AndroidLoggerFactory.java index 88ae5250..f27ff551 100755 --- a/slf4j-android/src/main/java/org/slf4j/impl/AndroidLoggerFactory.java +++ b/slf4j-android/src/main/java/org/slf4j/impl/AndroidLoggerFactory.java @@ -1,124 +1,124 @@ -/* - * Copyright (c) 2004-2013 QOS.ch - * All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ -package org.slf4j.impl; - -import org.slf4j.ILoggerFactory; -import org.slf4j.Logger; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * AndroidLoggerFactory is an implementation of {@link ILoggerFactory} returning - * the appropriately named {@link AndroidLoggerFactory} instance. - * - * @author Andrey KorzhevskiySimple implementation of {@link Logger} that sends all enabled log messages, - * for all defined loggers, to the console ({@code System.err}). - * The following system properties are supported to configure the behavior of this logger:
- * - *org.slf4j.simpleLogger.logFile - The output target which can be the path to a file, or
- * the special values "System.out" and "System.err". Default is "System.err".
- *
- * org.slf4j.simpleLogger.defaultLogLevel - Default log level for all instances of SimpleLogger.
- * Must be one of ("trace", "debug", "info", "warn", or "error"). If not specified, defaults to "info". org.slf4j.simpleLogger.log.a.b.c - Logging detail level for a SimpleLogger instance
- * named "a.b.c". Right-side value must be one of "trace", "debug", "info", "warn", or "error". When a SimpleLogger
- * named "a.b.c" is initialized, its level is assigned from this property. If unspecified, the level of nearest parent
- * logger will be used, and if none is set, then the value specified by
- * org.slf4j.simpleLogger.defaultLogLevel will be used.org.slf4j.simpleLogger.showDateTime - Set to true if you want the current date and
- * time to be included in output messages. Default is falseorg.slf4j.simpleLogger.dateTimeFormat - The date and time format to be used in the output messages.
- * The pattern describing the date and time format is defined by
- * SimpleDateFormat.
- * If the format is not specified or is invalid, the number of milliseconds since start up will be output. org.slf4j.simpleLogger.showThreadName -Set to true if you want to output the current
- * thread name. Defaults to true.org.slf4j.simpleLogger.showLogName - Set to true if you want the Logger instance name
- * to be included in output messages. Defaults to true.org.slf4j.simpleLogger.showShortLogName - Set to true if you want the last component
- * of the name to be included in output messages. Defaults to false.org.slf4j.simpleLogger.levelInBrackets - Should the level string be output in brackets? Defaults
- * to false.org.slf4j.simpleLogger.warnLevelString - The string value output for the warn level. Defaults
- * to WARN.In addition to looking for system properties with the names specified above, this implementation also checks for
- * a class loader resource named "simplelogger.properties", and includes any matching definitions
- * from this resource (if it exists).
With no configuration, the default output includes the relative time in milliseconds, thread name, the level, - * logger name, and the message followed by the line separator for the host. In log4j terms it amounts to the "%r [%t] - * %level %logger - %m%n" pattern.
- *Sample output follows.
- *- * 176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order. - * 225 [main] INFO examples.SortAlgo - Entered the sort method. - * 304 [main] INFO examples.SortAlgo - Dump of integer array: - * 317 [main] INFO examples.SortAlgo - Element [0] = 0 - * 331 [main] INFO examples.SortAlgo - Element [1] = 1 - * 343 [main] INFO examples.Sort - The next log statement should be an error message. - * 346 [main] ERROR examples.SortAlgo - Tried to dump an uninitialized array. - * at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) - * at org.log4j.examples.Sort.main(Sort.java:64) - * 467 [main] INFO examples.Sort - Exiting main method. - *- * - *
This implementation is heavily inspired by - * Apache Commons Logging's SimpleLog.
- * - * @author Ceki Gülcü - * @author Scott Sanders - * @author Rod Waldhoff - * @author Robert Burrell Donkin - * @author Cédrik LIME - */ -public class SimpleLogger extends MarkerIgnoringBase { - - private static final long serialVersionUID = -632788891211436180L; - private static final String CONFIGURATION_FILE = "simplelogger.properties"; - - private static long START_TIME = System.currentTimeMillis(); - private static final Properties SIMPLE_LOGGER_PROPS = new Properties(); - - private static final int LOG_LEVEL_TRACE = LocationAwareLogger.TRACE_INT; - private static final int LOG_LEVEL_DEBUG = LocationAwareLogger.DEBUG_INT; - private static final int LOG_LEVEL_INFO = LocationAwareLogger.INFO_INT; - private static final int LOG_LEVEL_WARN = LocationAwareLogger.WARN_INT; - private static final int LOG_LEVEL_ERROR = LocationAwareLogger.ERROR_INT; - - private static boolean INITIALIZED = false; - - private static int DEFAULT_LOG_LEVEL = LOG_LEVEL_INFO; - private static boolean SHOW_DATE_TIME = false; - private static String DATE_TIME_FORMAT_STR = null; - private static DateFormat DATE_FORMATTER = null; - private static boolean SHOW_THREAD_NAME = true; - private static boolean SHOW_LOG_NAME = true; - private static boolean SHOW_SHORT_LOG_NAME = false; - private static String LOG_FILE = "System.err"; - private static PrintStream TARGET_STREAM = null; - private static boolean LEVEL_IN_BRACKETS = false; - private static String WARN_LEVEL_STRING = "WARN"; - - - /** All system properties used bySimpleLogger start with this prefix */
- public static final String SYSTEM_PREFIX = "org.slf4j.simpleLogger.";
-
- public static final String DEFAULT_LOG_LEVEL_KEY = SYSTEM_PREFIX + "defaultLogLevel";
- public static final String SHOW_DATE_TIME_KEY = SYSTEM_PREFIX + "showDateTime";
- public static final String DATE_TIME_FORMAT_KEY = SYSTEM_PREFIX + "dateTimeFormat";
- public static final String SHOW_THREAD_NAME_KEY = SYSTEM_PREFIX + "showThreadName";
- public static final String SHOW_LOG_NAME_KEY = SYSTEM_PREFIX + "showLogName";
- public static final String SHOW_SHORT_LOG_NAME_KEY = SYSTEM_PREFIX + "showShortLogName";
- public static final String LOG_FILE_KEY = SYSTEM_PREFIX + "logFile";
- public static final String LEVEL_IN_BRACKETS_KEY = SYSTEM_PREFIX + "levelInBrackets";
- public static final String WARN_LEVEL_STRING_KEY = SYSTEM_PREFIX + "warnLevelString";
-
-
- public static final String LOG_KEY_PREFIX = SYSTEM_PREFIX + "log.";
-
-
- private static String getStringProperty(String name) {
- String prop = null;
- try {
- prop = System.getProperty(name);
- } catch (SecurityException e) {
- ; // Ignore
- }
- return (prop == null) ? SIMPLE_LOGGER_PROPS.getProperty(name) : prop;
- }
-
- private static String getStringProperty(String name, String defaultValue) {
- String prop = getStringProperty(name);
- return (prop == null) ? defaultValue : prop;
- }
-
- private static boolean getBooleanProperty(String name, boolean defaultValue) {
- String prop = getStringProperty(name);
- return (prop == null) ? defaultValue : "true".equalsIgnoreCase(prop);
- }
-
-
- // Initialize class attributes.
- // Load properties file, if found.
- // Override with system properties.
- static void init() {
- INITIALIZED = true;
- loadProperties();
-
- String defaultLogLevelString = getStringProperty(DEFAULT_LOG_LEVEL_KEY, null);
- if (defaultLogLevelString != null)
- DEFAULT_LOG_LEVEL = stringToLevel(defaultLogLevelString);
-
- SHOW_LOG_NAME = getBooleanProperty(SHOW_LOG_NAME_KEY, SHOW_LOG_NAME);
- SHOW_SHORT_LOG_NAME = getBooleanProperty(SHOW_SHORT_LOG_NAME_KEY, SHOW_SHORT_LOG_NAME);
- SHOW_DATE_TIME = getBooleanProperty(SHOW_DATE_TIME_KEY, SHOW_DATE_TIME);
- SHOW_THREAD_NAME = getBooleanProperty(SHOW_THREAD_NAME_KEY, SHOW_THREAD_NAME);
- DATE_TIME_FORMAT_STR = getStringProperty(DATE_TIME_FORMAT_KEY, DATE_TIME_FORMAT_STR);
- LEVEL_IN_BRACKETS = getBooleanProperty(LEVEL_IN_BRACKETS_KEY, LEVEL_IN_BRACKETS);
- WARN_LEVEL_STRING = getStringProperty(WARN_LEVEL_STRING_KEY, WARN_LEVEL_STRING);
-
- LOG_FILE = getStringProperty(LOG_FILE_KEY, LOG_FILE);
- TARGET_STREAM = computeTargetStream(LOG_FILE);
-
- if (DATE_TIME_FORMAT_STR != null) {
- try {
- DATE_FORMATTER = new SimpleDateFormat(DATE_TIME_FORMAT_STR);
- } catch (IllegalArgumentException e) {
- Util.report("Bad date format in " + CONFIGURATION_FILE + "; will output relative time", e);
- }
- }
- }
-
-
- private static PrintStream computeTargetStream(String logFile) {
- if ("System.err".equalsIgnoreCase(logFile))
- return System.err;
- else if ("System.out".equalsIgnoreCase(logFile)) {
- return System.out;
- } else {
- try {
- FileOutputStream fos = new FileOutputStream(logFile);
- PrintStream printStream = new PrintStream(fos);
- return printStream;
- } catch (FileNotFoundException e) {
- Util.report("Could not open [" + logFile + "]. Defaulting to System.err", e);
- return System.err;
- }
- }
- }
-
- private static void loadProperties() {
- // Add props from the resource simplelogger.properties
- InputStream in = AccessController.doPrivileged(
- new PrivilegedActionSimple implementation of {@link Logger} that sends all enabled log messages, + * for all defined loggers, to the console ({@code System.err}). + * The following system properties are supported to configure the behavior of this logger:
+ * + *org.slf4j.simpleLogger.logFile - The output target which can be the path to a file, or
+ * the special values "System.out" and "System.err". Default is "System.err".
+ *
+ * org.slf4j.simpleLogger.defaultLogLevel - Default log level for all instances of SimpleLogger.
+ * Must be one of ("trace", "debug", "info", "warn", or "error"). If not specified, defaults to "info". org.slf4j.simpleLogger.log.a.b.c - Logging detail level for a SimpleLogger instance
+ * named "a.b.c". Right-side value must be one of "trace", "debug", "info", "warn", or "error". When a SimpleLogger
+ * named "a.b.c" is initialized, its level is assigned from this property. If unspecified, the level of nearest parent
+ * logger will be used, and if none is set, then the value specified by
+ * org.slf4j.simpleLogger.defaultLogLevel will be used.org.slf4j.simpleLogger.showDateTime - Set to true if you want the current date and
+ * time to be included in output messages. Default is falseorg.slf4j.simpleLogger.dateTimeFormat - The date and time format to be used in the output messages.
+ * The pattern describing the date and time format is defined by
+ * SimpleDateFormat.
+ * If the format is not specified or is invalid, the number of milliseconds since start up will be output. org.slf4j.simpleLogger.showThreadName -Set to true if you want to output the current
+ * thread name. Defaults to true.org.slf4j.simpleLogger.showLogName - Set to true if you want the Logger instance name
+ * to be included in output messages. Defaults to true.org.slf4j.simpleLogger.showShortLogName - Set to true if you want the last component
+ * of the name to be included in output messages. Defaults to false.org.slf4j.simpleLogger.levelInBrackets - Should the level string be output in brackets? Defaults
+ * to false.org.slf4j.simpleLogger.warnLevelString - The string value output for the warn level. Defaults
+ * to WARN.In addition to looking for system properties with the names specified above, this implementation also checks for
+ * a class loader resource named "simplelogger.properties", and includes any matching definitions
+ * from this resource (if it exists).
With no configuration, the default output includes the relative time in milliseconds, thread name, the level, + * logger name, and the message followed by the line separator for the host. In log4j terms it amounts to the "%r [%t] + * %level %logger - %m%n" pattern.
+ *Sample output follows.
+ *+ * 176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order. + * 225 [main] INFO examples.SortAlgo - Entered the sort method. + * 304 [main] INFO examples.SortAlgo - Dump of integer array: + * 317 [main] INFO examples.SortAlgo - Element [0] = 0 + * 331 [main] INFO examples.SortAlgo - Element [1] = 1 + * 343 [main] INFO examples.Sort - The next log statement should be an error message. + * 346 [main] ERROR examples.SortAlgo - Tried to dump an uninitialized array. + * at org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) + * at org.log4j.examples.Sort.main(Sort.java:64) + * 467 [main] INFO examples.Sort - Exiting main method. + *+ * + *
This implementation is heavily inspired by + * Apache Commons Logging's SimpleLog.
+ * + * @author Ceki Gülcü + * @author Scott Sanders + * @author Rod Waldhoff + * @author Robert Burrell Donkin + * @author Cédrik LIME + */ +public class SimpleLogger extends MarkerIgnoringBase { + + private static final long serialVersionUID = -632788891211436180L; + private static final String CONFIGURATION_FILE = "simplelogger.properties"; + + private static long START_TIME = System.currentTimeMillis(); + private static final Properties SIMPLE_LOGGER_PROPS = new Properties(); + + private static final int LOG_LEVEL_TRACE = LocationAwareLogger.TRACE_INT; + private static final int LOG_LEVEL_DEBUG = LocationAwareLogger.DEBUG_INT; + private static final int LOG_LEVEL_INFO = LocationAwareLogger.INFO_INT; + private static final int LOG_LEVEL_WARN = LocationAwareLogger.WARN_INT; + private static final int LOG_LEVEL_ERROR = LocationAwareLogger.ERROR_INT; + + private static boolean INITIALIZED = false; + + private static int DEFAULT_LOG_LEVEL = LOG_LEVEL_INFO; + private static boolean SHOW_DATE_TIME = false; + private static String DATE_TIME_FORMAT_STR = null; + private static DateFormat DATE_FORMATTER = null; + private static boolean SHOW_THREAD_NAME = true; + private static boolean SHOW_LOG_NAME = true; + private static boolean SHOW_SHORT_LOG_NAME = false; + private static String LOG_FILE = "System.err"; + private static PrintStream TARGET_STREAM = null; + private static boolean LEVEL_IN_BRACKETS = false; + private static String WARN_LEVEL_STRING = "WARN"; + + + /** All system properties used bySimpleLogger start with this prefix */
+ public static final String SYSTEM_PREFIX = "org.slf4j.simpleLogger.";
+
+ public static final String DEFAULT_LOG_LEVEL_KEY = SYSTEM_PREFIX + "defaultLogLevel";
+ public static final String SHOW_DATE_TIME_KEY = SYSTEM_PREFIX + "showDateTime";
+ public static final String DATE_TIME_FORMAT_KEY = SYSTEM_PREFIX + "dateTimeFormat";
+ public static final String SHOW_THREAD_NAME_KEY = SYSTEM_PREFIX + "showThreadName";
+ public static final String SHOW_LOG_NAME_KEY = SYSTEM_PREFIX + "showLogName";
+ public static final String SHOW_SHORT_LOG_NAME_KEY = SYSTEM_PREFIX + "showShortLogName";
+ public static final String LOG_FILE_KEY = SYSTEM_PREFIX + "logFile";
+ public static final String LEVEL_IN_BRACKETS_KEY = SYSTEM_PREFIX + "levelInBrackets";
+ public static final String WARN_LEVEL_STRING_KEY = SYSTEM_PREFIX + "warnLevelString";
+
+
+ public static final String LOG_KEY_PREFIX = SYSTEM_PREFIX + "log.";
+
+
+ private static String getStringProperty(String name) {
+ String prop = null;
+ try {
+ prop = System.getProperty(name);
+ } catch (SecurityException e) {
+ ; // Ignore
+ }
+ return (prop == null) ? SIMPLE_LOGGER_PROPS.getProperty(name) : prop;
+ }
+
+ private static String getStringProperty(String name, String defaultValue) {
+ String prop = getStringProperty(name);
+ return (prop == null) ? defaultValue : prop;
+ }
+
+ private static boolean getBooleanProperty(String name, boolean defaultValue) {
+ String prop = getStringProperty(name);
+ return (prop == null) ? defaultValue : "true".equalsIgnoreCase(prop);
+ }
+
+
+ // Initialize class attributes.
+ // Load properties file, if found.
+ // Override with system properties.
+ static void init() {
+ INITIALIZED = true;
+ loadProperties();
+
+ String defaultLogLevelString = getStringProperty(DEFAULT_LOG_LEVEL_KEY, null);
+ if (defaultLogLevelString != null)
+ DEFAULT_LOG_LEVEL = stringToLevel(defaultLogLevelString);
+
+ SHOW_LOG_NAME = getBooleanProperty(SHOW_LOG_NAME_KEY, SHOW_LOG_NAME);
+ SHOW_SHORT_LOG_NAME = getBooleanProperty(SHOW_SHORT_LOG_NAME_KEY, SHOW_SHORT_LOG_NAME);
+ SHOW_DATE_TIME = getBooleanProperty(SHOW_DATE_TIME_KEY, SHOW_DATE_TIME);
+ SHOW_THREAD_NAME = getBooleanProperty(SHOW_THREAD_NAME_KEY, SHOW_THREAD_NAME);
+ DATE_TIME_FORMAT_STR = getStringProperty(DATE_TIME_FORMAT_KEY, DATE_TIME_FORMAT_STR);
+ LEVEL_IN_BRACKETS = getBooleanProperty(LEVEL_IN_BRACKETS_KEY, LEVEL_IN_BRACKETS);
+ WARN_LEVEL_STRING = getStringProperty(WARN_LEVEL_STRING_KEY, WARN_LEVEL_STRING);
+
+ LOG_FILE = getStringProperty(LOG_FILE_KEY, LOG_FILE);
+ TARGET_STREAM = computeTargetStream(LOG_FILE);
+
+ if (DATE_TIME_FORMAT_STR != null) {
+ try {
+ DATE_FORMATTER = new SimpleDateFormat(DATE_TIME_FORMAT_STR);
+ } catch (IllegalArgumentException e) {
+ Util.report("Bad date format in " + CONFIGURATION_FILE + "; will output relative time", e);
+ }
+ }
+ }
+
+
+ private static PrintStream computeTargetStream(String logFile) {
+ if ("System.err".equalsIgnoreCase(logFile))
+ return System.err;
+ else if ("System.out".equalsIgnoreCase(logFile)) {
+ return System.out;
+ } else {
+ try {
+ FileOutputStream fos = new FileOutputStream(logFile);
+ PrintStream printStream = new PrintStream(fos);
+ return printStream;
+ } catch (FileNotFoundException e) {
+ Util.report("Could not open [" + logFile + "]. Defaulting to System.err", e);
+ return System.err;
+ }
+ }
+ }
+
+ private static void loadProperties() {
+ // Add props from the resource simplelogger.properties
+ InputStream in = AccessController.doPrivileged(
+ new PrivilegedAction