From 4b4d533771e0501ffe1eb5e248e456f285357737 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Fri, 7 Feb 2025 10:36:45 +0100 Subject: [PATCH] In SLF4JProviders, move initialization of the markerFactory and mdcAdapter fields to the constructor. Added comments regarding LoggerFactory expectation of providers to initialize their MDCAdapter and markerFactory field as early as possible, preferably at construction time. Signed-off-by: Ceki Gulcu --- .../src/main/java/org/slf4j/LoggerFactory.java | 4 ++-- .../slf4j/helpers/SubstituteServiceProvider.java | 15 ++++++++++++--- .../java/org/slf4j/jul/JULServiceProvider.java | 12 ++++++++++-- .../java/org/slf4j/nop/NOPServiceProvider.java | 14 +++++++++++--- .../slf4j/reload4j/Reload4jServiceProvider.java | 11 +++++++++-- .../org/slf4j/simple/SimpleServiceProvider.java | 13 +++++++++++-- 6 files changed, 55 insertions(+), 14 deletions(-) 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(); + } }