Class SLF4JBridgeHandler
- java.lang.Object
-
- java.util.logging.Handler
-
- org.slf4j.bridge.SLF4JBridgeHandler
-
public class SLF4JBridgeHandler extends java.util.logging.HandlerBridge/route all JUL log records to the SLF4J API.
Essentially, the idea is to install on the root logger an instance of
SLF4JBridgeHandleras the sole JUL handler in the system. Subsequently, the SLF4JBridgeHandler instance will redirect all JUL log records are redirected to the SLF4J API based on the following mapping of levels:FINEST -> TRACE FINER -> DEBUG FINE -> DEBUG INFO -> INFO WARNING -> WARN SEVERE -> ERROR
Programmatic installation:
// Optionally remove existing handlers attached to j.u.l root logger SLF4JBridgeHandler.removeHandlersForRootLogger(); // (since SLF4J 1.6.5) // add SLF4JBridgeHandler to j.u.l's root logger, should be done once during // the initialization phase of your application SLF4JBridgeHandler.install();
Installation via logging.properties configuration file:
// register SLF4JBridgeHandler as handler for the j.u.l. root logger handlers = org.slf4j.bridge.SLF4JBridgeHandler
Once SLF4JBridgeHandler is installed, logging by j.u.l. loggers will be directed to SLF4J. Example:
import java.util.logging.Logger; ... // usual pattern: get a Logger and then log a message Logger julLogger = Logger.getLogger("org.wombat"); julLogger.fine("hello world"); // this will get redirected to SLF4JPlease note that translating a java.util.logging event into SLF4J incurs the cost of constructing
LogRecordinstance regardless of whether the SLF4J logger is disabled for the given level. Consequently, j.u.l. to SLF4J translation can seriously increase the cost of disabled logging statements (60 fold or 6000% increase) and measurably impact the performance of enabled log statements (20% overall increase). Please note that as of logback-version 0.9.25, it is possible to completely eliminate the 60 fold translation overhead for disabled log statements with the help of LevelChangePropagator.If you are concerned about application performance, then use of
SLF4JBridgeHandleris appropriate only if any one the following two conditions is true:- few j.u.l. logging statements are in play
- LevelChangePropagator has been installed
- Since:
- 1.5.1
-
-
Field Summary
Fields Modifier and Type Field Description private static intDEBUG_LEVEL_THRESHOLDprivate static java.lang.StringFQCNprivate static intINFO_LEVEL_THRESHOLDprivate static intTRACE_LEVEL_THRESHOLDprivate static java.lang.StringUNKNOWN_LOGGER_NAMEprivate static intWARN_LEVEL_THRESHOLD
-
Constructor Summary
Constructors Constructor Description SLF4JBridgeHandler()Initialize this handler.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidcallLocationAwareLogger(LocationAwareLogger lal, java.util.logging.LogRecord record)protected voidcallPlainSLF4JLogger(Logger slf4jLogger, java.util.logging.LogRecord record)voidclose()No-op implementation.voidflush()No-op implementation.private java.lang.StringgetMessageI18N(java.util.logging.LogRecord record)Get the record's message, possibly via a resource bundle.private static java.util.logging.LoggergetRootLogger()protected LoggergetSLF4JLogger(java.util.logging.LogRecord record)Return the Logger instance that will be used for logging.static voidinstall()Adds a SLF4JBridgeHandler instance to jul's root logger.static booleanisInstalled()Returns true if SLF4JBridgeHandler has been previously installed, returns false otherwise.voidpublish(java.util.logging.LogRecord record)Publish a LogRecord.static voidremoveHandlersForRootLogger()Invoking this method removes/unregisters/detaches all handlers currently attached to the root loggerstatic voiduninstall()Removes previously installed SLF4JBridgeHandler instances.
-
-
-
Field Detail
-
FQCN
private static final java.lang.String FQCN
-
UNKNOWN_LOGGER_NAME
private static final java.lang.String UNKNOWN_LOGGER_NAME
- See Also:
- Constant Field Values
-
TRACE_LEVEL_THRESHOLD
private static final int TRACE_LEVEL_THRESHOLD
-
DEBUG_LEVEL_THRESHOLD
private static final int DEBUG_LEVEL_THRESHOLD
-
INFO_LEVEL_THRESHOLD
private static final int INFO_LEVEL_THRESHOLD
-
WARN_LEVEL_THRESHOLD
private static final int WARN_LEVEL_THRESHOLD
-
-
Method Detail
-
install
public static void install()
Adds a SLF4JBridgeHandler instance to jul's root logger. This handler will redirect j.u.l. logging to SLF4J. However, only logs enabled in j.u.l. will be redirected. For example, if a log statement invoking a j.u.l. logger is disabled, then the corresponding non-event will not reach SLF4JBridgeHandler and cannot be redirected.
-
getRootLogger
private static java.util.logging.Logger getRootLogger()
-
uninstall
public static void uninstall() throws java.lang.SecurityExceptionRemoves previously installed SLF4JBridgeHandler instances. See alsoinstall().- Throws:
java.lang.SecurityException- ASecurityExceptionis thrown, if a security manager exists and if the caller does not have LoggingPermission("control").
-
isInstalled
public static boolean isInstalled() throws java.lang.SecurityExceptionReturns true if SLF4JBridgeHandler has been previously installed, returns false otherwise.- Returns:
- true if SLF4JBridgeHandler is already installed, false other wise
- Throws:
java.lang.SecurityException
-
removeHandlersForRootLogger
public static void removeHandlersForRootLogger()
Invoking this method removes/unregisters/detaches all handlers currently attached to the root logger- Since:
- 1.6.5
-
close
public void close()
No-op implementation.- Specified by:
closein classjava.util.logging.Handler
-
flush
public void flush()
No-op implementation.- Specified by:
flushin classjava.util.logging.Handler
-
getSLF4JLogger
protected Logger getSLF4JLogger(java.util.logging.LogRecord record)
Return the Logger instance that will be used for logging.
-
callLocationAwareLogger
protected void callLocationAwareLogger(LocationAwareLogger lal, java.util.logging.LogRecord record)
-
callPlainSLF4JLogger
protected void callPlainSLF4JLogger(Logger slf4jLogger, java.util.logging.LogRecord record)
-
getMessageI18N
private java.lang.String getMessageI18N(java.util.logging.LogRecord record)
Get the record's message, possibly via a resource bundle.- Parameters:
record-- Returns:
-
publish
public void publish(java.util.logging.LogRecord record)
Publish a LogRecord. The logging request was made initially to a Logger object, which initialized the LogRecord and forwarded it here. This handler ignores the Level attached to the LogRecord, as SLF4J cares about discarding log statements.- Specified by:
publishin classjava.util.logging.Handler- Parameters:
record- Description of the log event. A null record is silently ignored and is not published.
-
-