fix buf 311
diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
index 6bd7baf..3614110 100644
--- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
@@ -29,7 +29,7 @@
import java.util.*;
import org.slf4j.helpers.NOPLoggerFactory;
-import org.slf4j.helpers.SubstitutableLogger;
+import org.slf4j.helpers.SubstituteLogger;
import org.slf4j.helpers.SubstituteLoggerFactory;
import org.slf4j.helpers.Util;
import org.slf4j.impl.StaticLoggerBinder;
@@ -163,18 +163,18 @@
}
private final static void fixSubstitutedLoggers() {
- List<SubstitutableLogger> loggers = TEMP_FACTORY.getLoggers();
+ List<SubstituteLogger> loggers = TEMP_FACTORY.getLoggers();
if(loggers.isEmpty()){
return;
}
Util.report("The following set of substitute loggers may have been accessed");
- Util.report("during the initialization phase and logging calls during this");
- Util.report("phase were not honored but that calls in the future to these loggers");
- Util.report("will be honored.");
+ Util.report("during the initialization phase. Logging calls during this");
+ Util.report("phase were not honored. However, subsequent logging calls to these");
+ Util.report("loggers will work as normally expected.");
Util.report("See also " + SUBSTITUTE_LOGGER_URL);
- for(SubstitutableLogger subLogger : loggers){
+ for(SubstituteLogger subLogger : loggers){
subLogger.setDelegate(getLogger(subLogger.getName()));
Util.report(subLogger.getName());
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java
deleted file mode 100644
index 468d53b..0000000
--- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstitutableLogger.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/**
- * Copyright (c) 2004-2011 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.helpers;
-
-import org.slf4j.Logger;
-import org.slf4j.Marker;
-
-/**
- * A helper class which delegates all calls to different Loggers. This enables
- * swapping of the Logger implementation later.
- *
- * @author Chetan Mehrotra
- */
-public class SubstitutableLogger implements Logger {
-
- private final String name;
-
- private volatile Logger _delegate;
-
- public SubstitutableLogger(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public boolean isTraceEnabled() {
- return delegate().isTraceEnabled();
- }
-
- public void trace(String msg) {
- delegate().trace(msg);
- }
-
- public void trace(String format, Object arg) {
- delegate().trace(format, arg);
- }
-
- public void trace(String format, Object arg1, Object arg2) {
- delegate().trace(format, arg1, arg2);
- }
-
- public void trace(String format, Object... arguments) {
- delegate().trace(format, arguments);
- }
-
- public void trace(String msg, Throwable t) {
- delegate().trace(msg, t);
- }
-
- public boolean isTraceEnabled(Marker marker) {
- return delegate().isTraceEnabled(marker);
- }
-
- public void trace(Marker marker, String msg) {
- delegate().trace(marker, msg);
- }
-
- public void trace(Marker marker, String format, Object arg) {
- delegate().trace(marker, format, arg);
- }
-
- public void trace(Marker marker, String format, Object arg1, Object arg2) {
- delegate().trace(marker, format, arg1, arg2);
- }
-
- public void trace(Marker marker, String format, Object... arguments) {
- delegate().trace(marker, format, arguments);
- }
-
- public void trace(Marker marker, String msg, Throwable t) {
- delegate().trace(marker, msg, t);
- }
-
- public boolean isDebugEnabled() {
- return delegate().isDebugEnabled();
- }
-
- public void debug(String msg) {
- delegate().debug(msg);
- }
-
- public void debug(String format, Object arg) {
- delegate().debug(format, arg);
- }
-
- public void debug(String format, Object arg1, Object arg2) {
- delegate().debug(format, arg1, arg2);
- }
-
- public void debug(String format, Object... arguments) {
- delegate().debug(format, arguments);
- }
-
- public void debug(String msg, Throwable t) {
- delegate().debug(msg, t);
- }
-
- public boolean isDebugEnabled(Marker marker) {
- return delegate().isDebugEnabled(marker);
- }
-
- public void debug(Marker marker, String msg) {
- delegate().debug(marker, msg);
- }
-
- public void debug(Marker marker, String format, Object arg) {
- delegate().debug(marker, format, arg);
- }
-
- public void debug(Marker marker, String format, Object arg1, Object arg2) {
- delegate().debug(marker, format, arg1, arg2);
- }
-
- public void debug(Marker marker, String format, Object... arguments) {
- delegate().debug(marker, format, arguments);
- }
-
- public void debug(Marker marker, String msg, Throwable t) {
- delegate().debug(marker, msg, t);
- }
-
- public boolean isInfoEnabled() {
- return delegate().isInfoEnabled();
- }
-
- public void info(String msg) {
- delegate().info(msg);
- }
-
- public void info(String format, Object arg) {
- delegate().info(format, arg);
- }
-
- public void info(String format, Object arg1, Object arg2) {
- delegate().info(format, arg1, arg2);
- }
-
- public void info(String format, Object... arguments) {
- delegate().info(format, arguments);
- }
-
- public void info(String msg, Throwable t) {
- delegate().info(msg, t);
- }
-
- public boolean isInfoEnabled(Marker marker) {
- return delegate().isInfoEnabled(marker);
- }
-
- public void info(Marker marker, String msg) {
- delegate().info(marker, msg);
- }
-
- public void info(Marker marker, String format, Object arg) {
- delegate().info(marker, format, arg);
- }
-
- public void info(Marker marker, String format, Object arg1, Object arg2) {
- delegate().info(marker, format, arg1, arg2);
- }
-
- public void info(Marker marker, String format, Object... arguments) {
- delegate().info(marker, format, arguments);
- }
-
- public void info(Marker marker, String msg, Throwable t) {
- delegate().info(marker, msg, t);
- }
-
- public boolean isWarnEnabled() {
- return delegate().isWarnEnabled();
- }
-
- public void warn(String msg) {
- delegate().warn(msg);
- }
-
- public void warn(String format, Object arg) {
- delegate().warn(format, arg);
- }
-
- public void warn(String format, Object arg1, Object arg2) {
- delegate().warn(format, arg1, arg2);
- }
-
- public void warn(String format, Object... arguments) {
- delegate().warn(format, arguments);
- }
-
- public void warn(String msg, Throwable t) {
- delegate().warn(msg, t);
- }
-
- public boolean isWarnEnabled(Marker marker) {
- return delegate().isWarnEnabled(marker);
- }
-
- public void warn(Marker marker, String msg) {
- delegate().warn(marker, msg);
- }
-
- public void warn(Marker marker, String format, Object arg) {
- delegate().warn(marker, format, arg);
- }
-
- public void warn(Marker marker, String format, Object arg1, Object arg2) {
- delegate().warn(marker, format, arg1, arg2);
- }
-
- public void warn(Marker marker, String format, Object... arguments) {
- delegate().warn(marker, format, arguments);
- }
-
- public void warn(Marker marker, String msg, Throwable t) {
- delegate().warn(marker, msg, t);
- }
-
- public boolean isErrorEnabled() {
- return delegate().isErrorEnabled();
- }
-
- public void error(String msg) {
- delegate().error(msg);
- }
-
- public void error(String format, Object arg) {
- delegate().error(format, arg);
- }
-
- public void error(String format, Object arg1, Object arg2) {
- delegate().error(format, arg1, arg2);
- }
-
- public void error(String format, Object... arguments) {
- delegate().error(format, arguments);
- }
-
- public void error(String msg, Throwable t) {
- delegate().error(msg, t);
- }
-
- public boolean isErrorEnabled(Marker marker) {
- return delegate().isErrorEnabled(marker);
- }
-
- public void error(Marker marker, String msg) {
- delegate().error(marker, msg);
- }
-
- public void error(Marker marker, String format, Object arg) {
- delegate().error(marker, format, arg);
- }
-
- public void error(Marker marker, String format, Object arg1, Object arg2) {
- delegate().error(marker, format, arg1, arg2);
- }
-
- public void error(Marker marker, String format, Object... arguments) {
- delegate().error(marker, format, arguments);
- }
-
- public void error(Marker marker, String msg, Throwable t) {
- delegate().error(marker, msg, t);
- }
-
- public void setDelegate(Logger delegate) {
- this._delegate = delegate;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
-
- SubstitutableLogger that = (SubstitutableLogger) o;
-
- if (!name.equals(that.name)) return false;
-
- return true;
- }
-
- @Override
- public int hashCode() {
- return name.hashCode();
- }
-
- Logger delegate() {
- return _delegate != null ? _delegate : NOPLogger.NOP_LOGGER;
- }
-}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java
new file mode 100644
index 0000000..d7cfedf
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLogger.java
@@ -0,0 +1,325 @@
+/**
+ * Copyright (c) 2004-2011 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.helpers;
+
+import org.slf4j.Logger;
+import org.slf4j.Marker;
+
+/**
+ * A logger implementation which logs via a delegate logger. By default, the delegate is a
+ * {@link NOPLogger}. However, a different delegate can be set at anytime.
+ * <p/>
+ * See also the <a href="http://www.slf4j.org/codes.html#substituteLogger">relevant
+ * error code</a> documentation.
+ *
+ * @author Chetan Mehrotra
+ */
+public class SubstituteLogger implements Logger {
+
+ private final String name;
+
+ private volatile Logger _delegate;
+
+ public SubstituteLogger(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean isTraceEnabled() {
+ return delegate().isTraceEnabled();
+ }
+
+ public void trace(String msg) {
+ delegate().trace(msg);
+ }
+
+ public void trace(String format, Object arg) {
+ delegate().trace(format, arg);
+ }
+
+ public void trace(String format, Object arg1, Object arg2) {
+ delegate().trace(format, arg1, arg2);
+ }
+
+ public void trace(String format, Object... arguments) {
+ delegate().trace(format, arguments);
+ }
+
+ public void trace(String msg, Throwable t) {
+ delegate().trace(msg, t);
+ }
+
+ public boolean isTraceEnabled(Marker marker) {
+ return delegate().isTraceEnabled(marker);
+ }
+
+ public void trace(Marker marker, String msg) {
+ delegate().trace(marker, msg);
+ }
+
+ public void trace(Marker marker, String format, Object arg) {
+ delegate().trace(marker, format, arg);
+ }
+
+ public void trace(Marker marker, String format, Object arg1, Object arg2) {
+ delegate().trace(marker, format, arg1, arg2);
+ }
+
+ public void trace(Marker marker, String format, Object... arguments) {
+ delegate().trace(marker, format, arguments);
+ }
+
+ public void trace(Marker marker, String msg, Throwable t) {
+ delegate().trace(marker, msg, t);
+ }
+
+ public boolean isDebugEnabled() {
+ return delegate().isDebugEnabled();
+ }
+
+ public void debug(String msg) {
+ delegate().debug(msg);
+ }
+
+ public void debug(String format, Object arg) {
+ delegate().debug(format, arg);
+ }
+
+ public void debug(String format, Object arg1, Object arg2) {
+ delegate().debug(format, arg1, arg2);
+ }
+
+ public void debug(String format, Object... arguments) {
+ delegate().debug(format, arguments);
+ }
+
+ public void debug(String msg, Throwable t) {
+ delegate().debug(msg, t);
+ }
+
+ public boolean isDebugEnabled(Marker marker) {
+ return delegate().isDebugEnabled(marker);
+ }
+
+ public void debug(Marker marker, String msg) {
+ delegate().debug(marker, msg);
+ }
+
+ public void debug(Marker marker, String format, Object arg) {
+ delegate().debug(marker, format, arg);
+ }
+
+ public void debug(Marker marker, String format, Object arg1, Object arg2) {
+ delegate().debug(marker, format, arg1, arg2);
+ }
+
+ public void debug(Marker marker, String format, Object... arguments) {
+ delegate().debug(marker, format, arguments);
+ }
+
+ public void debug(Marker marker, String msg, Throwable t) {
+ delegate().debug(marker, msg, t);
+ }
+
+ public boolean isInfoEnabled() {
+ return delegate().isInfoEnabled();
+ }
+
+ public void info(String msg) {
+ delegate().info(msg);
+ }
+
+ public void info(String format, Object arg) {
+ delegate().info(format, arg);
+ }
+
+ public void info(String format, Object arg1, Object arg2) {
+ delegate().info(format, arg1, arg2);
+ }
+
+ public void info(String format, Object... arguments) {
+ delegate().info(format, arguments);
+ }
+
+ public void info(String msg, Throwable t) {
+ delegate().info(msg, t);
+ }
+
+ public boolean isInfoEnabled(Marker marker) {
+ return delegate().isInfoEnabled(marker);
+ }
+
+ public void info(Marker marker, String msg) {
+ delegate().info(marker, msg);
+ }
+
+ public void info(Marker marker, String format, Object arg) {
+ delegate().info(marker, format, arg);
+ }
+
+ public void info(Marker marker, String format, Object arg1, Object arg2) {
+ delegate().info(marker, format, arg1, arg2);
+ }
+
+ public void info(Marker marker, String format, Object... arguments) {
+ delegate().info(marker, format, arguments);
+ }
+
+ public void info(Marker marker, String msg, Throwable t) {
+ delegate().info(marker, msg, t);
+ }
+
+ public boolean isWarnEnabled() {
+ return delegate().isWarnEnabled();
+ }
+
+ public void warn(String msg) {
+ delegate().warn(msg);
+ }
+
+ public void warn(String format, Object arg) {
+ delegate().warn(format, arg);
+ }
+
+ public void warn(String format, Object arg1, Object arg2) {
+ delegate().warn(format, arg1, arg2);
+ }
+
+ public void warn(String format, Object... arguments) {
+ delegate().warn(format, arguments);
+ }
+
+ public void warn(String msg, Throwable t) {
+ delegate().warn(msg, t);
+ }
+
+ public boolean isWarnEnabled(Marker marker) {
+ return delegate().isWarnEnabled(marker);
+ }
+
+ public void warn(Marker marker, String msg) {
+ delegate().warn(marker, msg);
+ }
+
+ public void warn(Marker marker, String format, Object arg) {
+ delegate().warn(marker, format, arg);
+ }
+
+ public void warn(Marker marker, String format, Object arg1, Object arg2) {
+ delegate().warn(marker, format, arg1, arg2);
+ }
+
+ public void warn(Marker marker, String format, Object... arguments) {
+ delegate().warn(marker, format, arguments);
+ }
+
+ public void warn(Marker marker, String msg, Throwable t) {
+ delegate().warn(marker, msg, t);
+ }
+
+ public boolean isErrorEnabled() {
+ return delegate().isErrorEnabled();
+ }
+
+ public void error(String msg) {
+ delegate().error(msg);
+ }
+
+ public void error(String format, Object arg) {
+ delegate().error(format, arg);
+ }
+
+ public void error(String format, Object arg1, Object arg2) {
+ delegate().error(format, arg1, arg2);
+ }
+
+ public void error(String format, Object... arguments) {
+ delegate().error(format, arguments);
+ }
+
+ public void error(String msg, Throwable t) {
+ delegate().error(msg, t);
+ }
+
+ public boolean isErrorEnabled(Marker marker) {
+ return delegate().isErrorEnabled(marker);
+ }
+
+ public void error(Marker marker, String msg) {
+ delegate().error(marker, msg);
+ }
+
+ public void error(Marker marker, String format, Object arg) {
+ delegate().error(marker, format, arg);
+ }
+
+ public void error(Marker marker, String format, Object arg1, Object arg2) {
+ delegate().error(marker, format, arg1, arg2);
+ }
+
+ public void error(Marker marker, String format, Object... arguments) {
+ delegate().error(marker, format, arguments);
+ }
+
+ public void error(Marker marker, String msg, Throwable t) {
+ delegate().error(marker, msg, t);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ SubstituteLogger that = (SubstituteLogger) o;
+
+ if (!name.equals(that.name)) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ /**
+ * Return the delegate logger instance if set. Otherwise, return a {@link NOPLogger}
+ * instance.
+ */
+ Logger delegate() {
+ return _delegate != null ? _delegate : NOPLogger.NOP_LOGGER;
+ }
+
+ /**
+ * Typically called after the {@link org.slf4j.LoggerFactory} initialization phase is completed.
+ * @param delegate
+ */
+ public void setDelegate(Logger delegate) {
+ this._delegate = delegate;
+ }
+}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java
index f23569a..a54fcab 100644
--- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteLoggerFactory.java
@@ -33,36 +33,21 @@
import org.slf4j.Logger;
/**
- * SubstituteLoggerFactory is an trivial implementation of
- * {@link ILoggerFactory} which always returns the unique instance of NOPLogger.
- * <p/>
- * <p>
- * It used as a temporary substitute for the real ILoggerFactory during its
- * auto-configuration which may re-enter LoggerFactory to obtain logger
- * instances. See also http://bugzilla.slf4j.org/show_bug.cgi?id=106
- * <p/>
- * <p>
- * Logger implementations can swap out the NOPLogger with actual Logger
- * implementation once they are properly configured by changing the delegate
- * in {@link org.slf4j.helpers.SubstitutableLogger}
- * </p>
- *
+ * SubstituteLoggerFactory manages instances of {@link SubstituteLogger}.
* @author Ceki Gülcü
*/
public class SubstituteLoggerFactory implements ILoggerFactory {
- // keep a record of requested logger names
- final ConcurrentMap<String, SubstitutableLogger> loggers = new ConcurrentHashMap<String, SubstitutableLogger>();
+ final ConcurrentMap<String, SubstituteLogger> loggers = new ConcurrentHashMap<String, SubstituteLogger>();
public Logger getLogger(String name) {
- SubstitutableLogger logger;
- synchronized (loggers) {
- logger = loggers.get(name);
- if (logger == null) {
- logger = new SubstitutableLogger(name);
- loggers.put(name, logger);
+ SubstituteLogger logger = loggers.get(name);
+ if (logger == null) {
+ logger = new SubstituteLogger(name);
+ SubstituteLogger oldLogger = loggers.putIfAbsent(name, logger);
+ if (oldLogger != null)
+ logger = oldLogger;
}
- }
return logger;
}
@@ -70,8 +55,8 @@
return new ArrayList<String>(loggers.keySet());
}
- public List<SubstitutableLogger> getLoggers() {
- return new ArrayList<SubstitutableLogger>(loggers.values());
+ public List<SubstituteLogger> getLoggers() {
+ return new ArrayList<SubstituteLogger>(loggers.values());
}
public void clear() {
diff --git a/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java
index 67d3547..3055b7e 100644
--- a/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java
@@ -44,7 +44,7 @@
private static final Set<String> EXCLUDED_METHODS = new HashSet<String>(Arrays.asList("getName"));
public void testDelegate() throws Exception {
- SubstitutableLogger log = new SubstitutableLogger("foo");
+ SubstituteLogger log = new SubstituteLogger("foo");
assertTrue(log.delegate() instanceof NOPLogger);
Set<String> expectedMethodSignatures = determineMethodSignatures(Logger.class);
diff --git a/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java b/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java
index c6c5a48..7acb43c 100644
--- a/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/helpers/SubstituteLoggerFactoryTest.java
@@ -60,7 +60,7 @@
Set<String> expectedNames = new HashSet<String>(Arrays.asList("foo1","foo2"));
Set<String> actualNames = new HashSet<String>();
- for(SubstitutableLogger slog : factory.getLoggers()){
+ for(SubstituteLogger slog : factory.getLoggers()){
actualNames.add(slog.getName());
}
diff --git a/slf4j-scala-api/src/main/scala/A.scala b/slf4j-scala-api/src/main/scala/A.scala
new file mode 100644
index 0000000..3a9d44c
--- /dev/null
+++ b/slf4j-scala-api/src/main/scala/A.scala
@@ -0,0 +1,8 @@
+/*
+ * Created by IntelliJ IDEA.
+ * User: ceki
+ * Date: 03.05.11
+ * Time: 09:03
+ */
+package ;
+public scala class A { }
\ No newline at end of file
diff --git a/slf4j-site/src/site/pages/codes.html b/slf4j-site/src/site/pages/codes.html
index cb32485..e28a3a3 100755
--- a/slf4j-site/src/site/pages/codes.html
+++ b/slf4j-site/src/site/pages/codes.html
@@ -401,29 +401,28 @@
<p>Highly configurable logging systems such as logback and log4j
may create components which invoke loggers during their own
initialization. See issue <a
- href="http://jira.qos.ch/browse/LBCORE-47">lbcore-47</a> for a
+ href="http://jira.qos.ch/browse/LOGBACK-127">LOGBACK-127</a> for a
typical occurrence. However, since the binding process with SLF4J
has not yet completed (because the underlying logging system was
not yet completely loaded into memory), it is not possible to
- honor such logger creation requests, resulting in a
- <code>NullPointerException</code>.</p>
+ honor such logger creation requests.</p>
- <p>To avoid this chicken-and-egg problem, SLF4J substitutes a
- substitutable logger which initially delegates to no-operation logger factory
- during this initialization phase. Later after the LoggerFactory initialization
- is completed then the delegates in the SubstituteLoggers are replaced with actual
- logger implementations.
+ <p>To avoid this chicken-and-egg problem, SLF4J creates substitute
+ loggers during this phase (initialization). Calls made to the
+ substitute loggers during this phase are simply dropped. After the
+ initialization completes, the substitute logger will delegate
+ logging calls to the appropriate logger implementation and
+ otherwise will function as any other logger returned by
+ <code>LoggerFactory</code>.
</p>
- <p>If any substitute logger had to be created, SLF4J will emit a
- a listing of such loggers. This list is intended to let
- you know that some of the initial logging statements from these
- loggers might have been missed
+ <p>If any substitute logger had to be created, SLF4J will emit a a
+ listing of such loggers. This list is intended to let you know
+ that any logging calls made to these loggers during initialization
+ have been dropped.
</p>
-
-
<script src="templates/footer.js" type="text/javascript"></script>
</div>
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index 7b187b9..4afbff2 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -33,6 +33,16 @@
<p>Added slf4j-android module to the slf4j distribution. This
module is contributed by Andrey Korzhevskiy.</p>
+
+ <p>Loggers created during the initialization phase are no longer
+ <code>NOPLoggers</code> which drop all logging calls. Instead,
+ SLF4J now creates substitute loggers which delegate to the
+ appropriate logger implementation after the initilization phase
+ completes. Only calls made to these loggers during the
+ initialization phase are dropped. This enhacement was proposed in
+ <a href="http://bugzilla.slf4j.org/show_bug.cgi?id=311">bug 311</a>
+ by Chetan Mehrotra.
+ </p>
<p>Concunrrency improvement in
<code>BasicMarkerFactory</code>. This improvement was contributed