diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java index c6cee5db..0dc7a72c 100755 --- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java @@ -220,8 +220,8 @@ public final class LoggerFactory { /** * The value of PROVIDER.getMDCAdapter() can be null while PROVIDER has not yet initialized. * - * However, - * + * However, SLF4JServiceProvider implementations are expected to initialize their internal + * MDCAdapter field in their constructor or on field declaration. */ private static void earlyBindMDCAdapter() { MDCAdapter mdcAdapter = PROVIDER.getMDCAdapter(); diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteServiceProvider.java b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteServiceProvider.java index 2c59530d..ad03eaef 100755 --- a/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteServiceProvider.java +++ b/slf4j-api/src/main/java/org/slf4j/helpers/SubstituteServiceProvider.java @@ -7,8 +7,18 @@ import org.slf4j.spi.SLF4JServiceProvider; public class SubstituteServiceProvider implements SLF4JServiceProvider { private final SubstituteLoggerFactory loggerFactory = new SubstituteLoggerFactory(); - private final IMarkerFactory markerFactory = new BasicMarkerFactory(); - private final MDCAdapter mdcAdapter = new BasicMDCAdapter(); + + // LoggerFactory expects providers to initialize markerFactory as early as possible. + private final IMarkerFactory markerFactory; + + // LoggerFactory expects providers to initialize their MDCAdapter field + // as early as possible, preferably at construction time. + private final MDCAdapter mdcAdapter; + + public SubstituteServiceProvider() { + markerFactory = new BasicMarkerFactory(); + mdcAdapter = new BasicMDCAdapter(); + } @Override public ILoggerFactory getLoggerFactory() { @@ -36,6 +46,5 @@ public class SubstituteServiceProvider implements SLF4JServiceProvider { @Override public void initialize() { - } } diff --git a/slf4j-jdk14/src/main/java/org/slf4j/jul/JULServiceProvider.java b/slf4j-jdk14/src/main/java/org/slf4j/jul/JULServiceProvider.java index d3d48519..15f492f1 100755 --- a/slf4j-jdk14/src/main/java/org/slf4j/jul/JULServiceProvider.java +++ b/slf4j-jdk14/src/main/java/org/slf4j/jul/JULServiceProvider.java @@ -17,8 +17,16 @@ public class JULServiceProvider implements SLF4JServiceProvider { public static String REQUESTED_API_VERSION = "2.0.99"; // !final private ILoggerFactory loggerFactory; - private IMarkerFactory markerFactory = new BasicMarkerFactory(); - private MDCAdapter mdcAdapter = new BasicMDCAdapter(); + // LoggerFactory expects providers to initialize markerFactory as early as possible. + private final IMarkerFactory markerFactory; + // LoggerFactory expects providers to initialize their MDCAdapter field + // as early as possible, preferably at construction time. + private final MDCAdapter mdcAdapter; + + public JULServiceProvider() { + markerFactory = new BasicMarkerFactory(); + mdcAdapter = new BasicMDCAdapter(); + } @Override public ILoggerFactory getLoggerFactory() { diff --git a/slf4j-nop/src/main/java/org/slf4j/nop/NOPServiceProvider.java b/slf4j-nop/src/main/java/org/slf4j/nop/NOPServiceProvider.java index 515cf23b..e4b85c8d 100755 --- a/slf4j-nop/src/main/java/org/slf4j/nop/NOPServiceProvider.java +++ b/slf4j-nop/src/main/java/org/slf4j/nop/NOPServiceProvider.java @@ -18,9 +18,18 @@ public class NOPServiceProvider implements SLF4JServiceProvider { public static String REQUESTED_API_VERSION = "2.0.99"; // !final private final ILoggerFactory loggerFactory = new NOPLoggerFactory(); - private final IMarkerFactory markerFactory = new BasicMarkerFactory(); - private final MDCAdapter mdcAdapter = new NOPMDCAdapter(); + // LoggerFactory expects providers to initialize markerFactory as early as possible. + private final IMarkerFactory markerFactory; + + // LoggerFactory expects providers to initialize their MDCAdapter field + // as early as possible, preferably at construction time. + private final MDCAdapter mdcAdapter; + + public NOPServiceProvider() { + markerFactory = new BasicMarkerFactory(); + mdcAdapter = new NOPMDCAdapter(); + } public ILoggerFactory getLoggerFactory() { return loggerFactory; } @@ -39,7 +48,6 @@ public class NOPServiceProvider implements SLF4JServiceProvider { } public void initialize() { - } diff --git a/slf4j-reload4j/src/main/java/org/slf4j/reload4j/Reload4jServiceProvider.java b/slf4j-reload4j/src/main/java/org/slf4j/reload4j/Reload4jServiceProvider.java index 170cbd92..b7990085 100644 --- a/slf4j-reload4j/src/main/java/org/slf4j/reload4j/Reload4jServiceProvider.java +++ b/slf4j-reload4j/src/main/java/org/slf4j/reload4j/Reload4jServiceProvider.java @@ -19,10 +19,17 @@ public class Reload4jServiceProvider implements SLF4JServiceProvider { public static String REQUESTED_API_VERSION = "2.0.99"; // !final private ILoggerFactory loggerFactory; - private IMarkerFactory markerFactory = new BasicMarkerFactory(); - private MDCAdapter mdcAdapter = new Reload4jMDCAdapter(); + + // LoggerFactory expects providers to initialize markerFactory as early as possible. + private final IMarkerFactory markerFactory; + + // LoggerFactory expects providers to have a valid MDCAdapter field + // as early as possible, preferably at construction time. + private final MDCAdapter mdcAdapter; public Reload4jServiceProvider() { + markerFactory = new BasicMarkerFactory(); + mdcAdapter = new Reload4jMDCAdapter(); try { @SuppressWarnings("unused") Level level = Level.TRACE; diff --git a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleServiceProvider.java b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleServiceProvider.java index f2462737..a73a4a9a 100755 --- a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleServiceProvider.java +++ b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleServiceProvider.java @@ -17,8 +17,16 @@ public class SimpleServiceProvider implements SLF4JServiceProvider { public static String REQUESTED_API_VERSION = "2.0.99"; // !final private ILoggerFactory loggerFactory; - private IMarkerFactory = new BasicMarkerFactory(); - private MDCAdapter mdcAdapter = new NOPMDCAdapter(); + // LoggerFactory expects providers to initialize markerFactory as early as possible. + private final IMarkerFactory markerFactory; + // LoggerFactory expects providers to initialize their MDCAdapter field + // as early as possible, preferably at construction time. + private final MDCAdapter mdcAdapter; + + public SimpleServiceProvider() { + markerFactory = new BasicMarkerFactory(); + mdcAdapter = new NOPMDCAdapter(); + } public ILoggerFactory getLoggerFactory() { return loggerFactory; @@ -42,6 +50,7 @@ public class SimpleServiceProvider implements SLF4JServiceProvider { @Override public void initialize() { loggerFactory = new SimpleLoggerFactory(); + } }