[slf4j-dev] svn commit: r1021 - in slf4j/trunk/jul-to-slf4j: . src src/main src/main/java src/main/java/org src/main/java/org/slf4j src/main/java/org/slf4j/bridge src/test src/test/java src/test/java/org src/test/java/org/slf4j src/test/java/org/slf4j/bridge
ceki at slf4j.org
ceki at slf4j.org
Wed May 28 22:28:14 CEST 2008
Author: ceki
Date: Wed May 28 22:28:14 2008
New Revision: 1021
Added:
slf4j/trunk/jul-to-slf4j/ (props changed)
slf4j/trunk/jul-to-slf4j/src/
slf4j/trunk/jul-to-slf4j/src/main/
slf4j/trunk/jul-to-slf4j/src/main/java/
slf4j/trunk/jul-to-slf4j/src/main/java/org/
slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/
slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/
slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java
slf4j/trunk/jul-to-slf4j/src/test/
slf4j/trunk/jul-to-slf4j/src/test/java/
slf4j/trunk/jul-to-slf4j/src/test/java/org/
slf4j/trunk/jul-to-slf4j/src/test/java/org/slf4j/
slf4j/trunk/jul-to-slf4j/src/test/java/org/slf4j/bridge/
Log:
- started work on jul-to-slf4j bridge as requested in bug 38
Added: slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java
==============================================================================
--- (empty file)
+++ slf4j/trunk/jul-to-slf4j/src/main/java/org/slf4j/bridge/SLF4JBridgeHandler.java Wed May 28 22:28:14 2008
@@ -0,0 +1,221 @@
+package org.slf4j.bridge;
+
+import java.util.logging.ErrorManager;
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.LogRecord;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * JUL bridge/router for SLF4J.
+ *
+ * @author Christian Stein
+ * @since 1.5.1
+ */
+public class SLF4JBridgeHandler extends Handler {
+
+ /**
+ * Resets the entire JUL logging system and adds a single SLF4JHandler
+ * instance to the root logger.
+ * <p>
+ * Same as: <code>SLF4JHandler.install(new SLF4JHandler(true, true));</code>
+ */
+ public static void install() {
+ install(new SLF4JBridgeHandler(true, true));
+ }
+
+ /**
+ * Resets the entire JUL logging system and adds the SLF4JHandler instance to
+ * the root logger.
+ *
+ * <pre><code>
+ * SLF4JHandler handler = new SLF4JHandler(true, true);
+ * handler.setFilter(...);
+ * handler.setFormatter(...);
+ * handler.setErrorManager(...);
+ * SLF4JHandler.install(handler);
+ * </code></pre>
+ */
+ public static void install(SLF4JBridgeHandler handler) {
+ LogManager.getLogManager().reset();
+ LogManager.getLogManager().getLogger("").addHandler(handler);
+ }
+
+ /**
+ * Rereads the JUL configuration.
+ *
+ * @see LogManager#readConfiguration();
+ * @throws Exception
+ * A <code>SecurityException</code> is thrown, if a security
+ * manager exists and if the caller does not have
+ * LoggingPermission("control"). <code>IOException</code> if
+ * there are IO problems reading the configuration.
+ */
+ public static void uninstall() throws Exception {
+ LogManager.getLogManager().readConfiguration();
+ }
+
+ protected final boolean classname;
+
+ protected final boolean format;
+
+ /**
+ * Initialize this handler.
+ *
+ * @param classname
+ * Use the source class name provided by the LogRecord to get
+ * the SLF4J Logger name. If <code>false</code>, the raw
+ * name of the JUL logger is used.
+ * @param format
+ * If <code>true</code>, use the attached formatter if
+ * available. If <code>false</code> the formatter is ignored.
+ */
+ public SLF4JBridgeHandler(boolean classname, boolean format) {
+ this.classname = classname;
+ this.format = format;
+ }
+
+ /**
+ * No-op implementation.
+ */
+ public void close() {
+ // empty
+ }
+
+ /**
+ * No-op implementation.
+ */
+ public void flush() {
+ // empty
+ }
+
+ /**
+ * Return the Logger instance that will be used for logging.
+ */
+ protected Logger getPublisher(LogRecord record) {
+ String name = null;
+ if (classname) {
+ if (name == null) {
+ name = record.getSourceClassName();
+ }
+ }
+ if (name == null) {
+ name = record.getLoggerName();
+ }
+ if (name == null) {
+ name = SLF4JBridgeHandler.class.getName();
+ }
+ return LoggerFactory.getLogger(name);
+ }
+
+ /**
+ * Returns {@code Level.ALL} as SLF4J cares about discarding log statements.
+ */
+ public final synchronized Level getLevel() {
+ return Level.ALL;
+ }
+
+ /**
+ * Publish a LogRecord.
+ * <p>
+ * The logging request was made initially to a Logger object, which
+ * initialized the LogRecord and forwarded it here.
+ * <p>
+ * This handler ignores the Level attached to the LogRecord, as SLF4J cares
+ * about discarding log statements.
+ *
+ * @param record
+ * Description of the log event. A null record is silently
+ * ignored and is not published.
+ */
+ public void publish(LogRecord record) {
+ /*
+ * Silently ignore null records.
+ */
+ if (record == null) {
+ return;
+ }
+ /*
+ * Get our SLF4J logger for publishing the record.
+ */
+ Logger publisher = getPublisher(record);
+ Throwable thrown = record.getThrown(); // can be null!
+ String message = record.getMessage(); // can be null!
+ if (format && getFormatter() != null) {
+ try {
+ message = getFormatter().format(record);
+ } catch (Exception ex) {
+ reportError(null, ex, ErrorManager.FORMAT_FAILURE);
+ return;
+ }
+ }
+ if (message == null) {
+ return;
+ }
+ /*
+ * TRACE
+ */
+ if (record.getLevel().intValue() <= Level.FINEST.intValue()) {
+ publisher.trace(message, thrown);
+ return;
+ }
+ /*
+ * DEBUG
+ */
+ if (record.getLevel() == Level.FINER) {
+ publisher.debug(message, thrown);
+ return;
+ }
+ if (record.getLevel() == Level.FINE) {
+ publisher.debug(message, thrown);
+ return;
+ }
+ /*
+ * INFO
+ */
+ if (record.getLevel() == Level.CONFIG) {
+ publisher.info(message, thrown);
+ return;
+ }
+ if (record.getLevel() == Level.INFO) {
+ publisher.info(message, thrown);
+ return;
+ }
+ /*
+ * WARN
+ */
+ if (record.getLevel() == Level.WARNING) {
+ publisher.warn(message);
+ return;
+ }
+ /*
+ * ERROR
+ */
+ if (record.getLevel().intValue() >= Level.SEVERE.intValue()) {
+ publisher.error(message, thrown);
+ return;
+ }
+ /*
+ * Still here? Fallback and out.
+ */
+ publishFallback(record, publisher);
+ }
+
+ /**
+ * Called by publish if no level value matched.
+ * <p>
+ * This implementation uses SLF4Js DEBUG level.
+ *
+ * @param record
+ * to publish
+ * @param publisher
+ * who logs out
+ */
+ protected void publishFallback(LogRecord record, Logger publisher) {
+ publisher.debug(record.getMessage(), record.getThrown());
+ }
+
+}
More information about the slf4j-dev
mailing list