This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch fix/rebase-on-log4j-api-2.x in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 67b0fefa7a108324a49c315c7ad488b5b5ad2e4d Author: Piotr P. Karwasz <[email protected]> AuthorDate: Fri Mar 22 16:49:06 2024 +0100 Rebase `log4j-to-slf4j` upon Log4j API 2.24.0 --- log4j-to-slf4j/pom.xml | 10 +++--- .../slf4j/{SLF4JProvider.java => Activator.java} | 20 +++++------ .../org/apache/logging/slf4j/MDCContextMap.java | 4 +-- .../java/org/apache/logging/slf4j/SLF4JLogger.java | 14 ++++---- .../org/apache/logging/slf4j/SLF4JProvider.java | 18 +++++++++- .../org/apache/logging/slf4j/package-info.java | 2 +- .../services/org.apache.logging.log4j.spi.Provider | 1 + .../java/org/apache/logging/slf4j/LoggerTest.java | 40 ++++++++++++++++------ 8 files changed, 73 insertions(+), 36 deletions(-) diff --git a/log4j-to-slf4j/pom.xml b/log4j-to-slf4j/pom.xml index f92ff4d06d..bac9e64a9d 100644 --- a/log4j-to-slf4j/pom.xml +++ b/log4j-to-slf4j/pom.xml @@ -37,13 +37,13 @@ <!-- This bridge also support SLF4J 2.x --> org.slf4j.*;version="${slf4j.support.range}" </bnd-extra-package-options> - <bnd-extra-module-options> - <!-- The module descriptor is in `META-INF/versions/9` - BND 6.x can not find it --> - org.slf4j;substitute="slf4j-api" - </bnd-extra-module-options> </properties> <dependencies> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.framework</artifactId> + <scope>provided</scope> + </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/Activator.java similarity index 66% copy from log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java copy to log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/Activator.java index c340d30c40..5080869f5d 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/Activator.java @@ -16,16 +16,16 @@ */ package org.apache.logging.slf4j; -import aQute.bnd.annotation.Resolution; -import aQute.bnd.annotation.spi.ServiceProvider; -import org.apache.logging.log4j.spi.Provider; +import org.apache.logging.log4j.util.ProviderActivator; +import org.osgi.annotation.bundle.Header; -/** - * Bind the Log4j API to SLF4J. - */ -@ServiceProvider(value = Provider.class, resolution = Resolution.OPTIONAL) -public class SLF4JProvider extends Provider { - public SLF4JProvider() { - super(15, "3.0.0", SLF4JLoggerContextFactory.class, MDCContextMap.class); +@Header(name = org.osgi.framework.Constants.BUNDLE_ACTIVATOR, value = "${@class}") +@Header( + name = org.osgi.framework.Constants.BUNDLE_ACTIVATIONPOLICY, + value = org.osgi.framework.Constants.ACTIVATION_LAZY) +public class Activator extends ProviderActivator { + + public Activator() { + super(new SLF4JProvider()); } } diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java index f2e3463e7e..4f2ef190bb 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/MDCContextMap.java @@ -19,7 +19,7 @@ package org.apache.logging.slf4j; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import org.apache.logging.log4j.spi.ThreadContextMap; +import org.apache.logging.log4j.spi.CleanableThreadContextMap; import org.apache.logging.log4j.util.SortedArrayStringMap; import org.apache.logging.log4j.util.StringMap; import org.slf4j.MDC; @@ -27,7 +27,7 @@ import org.slf4j.MDC; /** * Bind the ThreadContextMap to the SLF4J MDC. */ -public class MDCContextMap implements ThreadContextMap { +public class MDCContextMap implements CleanableThreadContextMap { private static final StringMap EMPTY_CONTEXT_DATA = new SortedArrayStringMap(1); diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogger.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogger.java index 919cf2dee5..26e94c67b3 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogger.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogger.java @@ -23,14 +23,14 @@ import org.apache.logging.log4j.message.LoggerNameAwareMessage; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.MessageFactory; import org.apache.logging.log4j.spi.AbstractLogger; -import org.apache.logging.log4j.spi.LoggingSystem; -import org.apache.logging.log4j.spi.recycler.Recycler; +import org.apache.logging.log4j.util.Constants; import org.slf4j.LoggerFactory; import org.slf4j.MarkerFactory; import org.slf4j.spi.LocationAwareLogger; public class SLF4JLogger extends AbstractLogger { + private static final long serialVersionUID = 1L; /** * Logback supports turbo filters, that can override the logger's level. * Therefore we can never return a no-op builder. @@ -38,11 +38,9 @@ public class SLF4JLogger extends AbstractLogger { private static final boolean LAZY_LEVEL_CHECK = "ch.qos.logback.classic.LoggerContext" .equals(LoggerFactory.getILoggerFactory().getClass().getName()); - private static final Recycler<SLF4JLogBuilder> LOG_BUILDER_RECYCLER = - LoggingSystem.getRecyclerFactory().create(SLF4JLogBuilder::new); + private static final ThreadLocal<SLF4JLogBuilder> logBuilder = ThreadLocal.withInitial(SLF4JLogBuilder::new); private final org.slf4j.Logger logger; - private final LocationAwareLogger locationAwareLogger; public SLF4JLogger(final String name, final MessageFactory messageFactory, final org.slf4j.Logger logger) { @@ -366,8 +364,10 @@ public class SLF4JLogger extends AbstractLogger { @Override protected LogBuilder getLogBuilder(final Level level) { - final SLF4JLogBuilder builder = LOG_BUILDER_RECYCLER.acquire(); - return builder.reset(this, level); + final SLF4JLogBuilder builder = logBuilder.get(); + return Constants.ENABLE_THREADLOCALS && !builder.isInUse() + ? builder.reset(this, level) + : new SLF4JLogBuilder(this, level); } @Override diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java index c340d30c40..318d7937f6 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JProvider.java @@ -18,14 +18,30 @@ package org.apache.logging.slf4j; import aQute.bnd.annotation.Resolution; import aQute.bnd.annotation.spi.ServiceProvider; +import org.apache.logging.log4j.spi.LoggerContextFactory; import org.apache.logging.log4j.spi.Provider; +import org.apache.logging.log4j.spi.ThreadContextMap; /** * Bind the Log4j API to SLF4J. */ @ServiceProvider(value = Provider.class, resolution = Resolution.OPTIONAL) public class SLF4JProvider extends Provider { + + private static final LoggerContextFactory CONTEXT_FACTORY = new SLF4JLoggerContextFactory(); + private static final ThreadContextMap THREAD_CONTEXT_MAP = new MDCContextMap(); + public SLF4JProvider() { - super(15, "3.0.0", SLF4JLoggerContextFactory.class, MDCContextMap.class); + super(15, CURRENT_VERSION); + } + + @Override + public LoggerContextFactory getLoggerContextFactory() { + return CONTEXT_FACTORY; + } + + @Override + public ThreadContextMap getThreadContextMapInstance() { + return THREAD_CONTEXT_MAP; } } diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/package-info.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/package-info.java index e354601ca7..ba4cb130be 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/package-info.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/package-info.java @@ -18,7 +18,7 @@ * SLF4J support. */ @Export -@Version("2.20.1") +@Version("2.24.0") package org.apache.logging.slf4j; import org.osgi.annotation.bundle.Export; diff --git a/log4j-to-slf4j/src/main/resources/META-INF/services/org.apache.logging.log4j.spi.Provider b/log4j-to-slf4j/src/main/resources/META-INF/services/org.apache.logging.log4j.spi.Provider new file mode 100644 index 0000000000..c66b5c946a --- /dev/null +++ b/log4j-to-slf4j/src/main/resources/META-INF/services/org.apache.logging.log4j.spi.Provider @@ -0,0 +1 @@ +org.apache.logging.slf4j.SLF4JProvider \ No newline at end of file diff --git a/log4j-to-slf4j/src/test/java/org/apache/logging/slf4j/LoggerTest.java b/log4j-to-slf4j/src/test/java/org/apache/logging/slf4j/LoggerTest.java index ad14d17aed..5f89d5a526 100644 --- a/log4j-to-slf4j/src/test/java/org/apache/logging/slf4j/LoggerTest.java +++ b/log4j-to-slf4j/src/test/java/org/apache/logging/slf4j/LoggerTest.java @@ -25,7 +25,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -41,9 +40,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.message.MessageFactory; -import org.apache.logging.log4j.message.ReusableMessageFactory; +import org.apache.logging.log4j.message.ParameterizedMessageFactory; import org.apache.logging.log4j.message.StringFormatterMessageFactory; -import org.apache.logging.log4j.spi.LoggingSystem; +import org.apache.logging.log4j.spi.AbstractLogger; +import org.apache.logging.log4j.spi.MessageFactory2Adapter; import org.apache.logging.log4j.test.junit.UsingStatusListener; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -53,6 +53,7 @@ import org.slf4j.MDC; @LoggerContextSource public class LoggerTest { + private static final Object OBJ = new Object(); // Log4j objects private Logger logger; // Logback objects @@ -79,9 +80,23 @@ public class LoggerTest { assertThat(list.strList, hasSize(2)); } + @Test + public void basicFlowDepreacted() { + logger.entry(); + logger.exit(); + assertThat(list.strList, hasSize(2)); + } + + @Test + public void simpleFlowDeprecated() { + logger.entry(OBJ); + logger.exit(0); + assertThat(list.strList, hasSize(2)); + } + @Test public void simpleFlow() { - logger.traceEntry("foo"); + logger.entry(OBJ); logger.traceExit(0); assertThat(list.strList, hasSize(2)); } @@ -113,7 +128,7 @@ public class LoggerTest { final Logger testLogger = testMessageFactoryMismatch( "getLogger_String_MessageFactoryMismatch", StringFormatterMessageFactory.INSTANCE, - new ReusableMessageFactory()); + ParameterizedMessageFactory.INSTANCE); testLogger.debug("%,d", Integer.MAX_VALUE); assertThat(list.strList, hasSize(1)); assertThat(list.strList, hasItem(String.format("%,d", Integer.MAX_VALUE))); @@ -138,12 +153,17 @@ public class LoggerTest { return testLogger; } - private static void checkMessageFactory(final MessageFactory messageFactory, final Logger testLogger) { - if (messageFactory == null) { - assertSame(LoggingSystem.getMessageFactory(), testLogger.getMessageFactory()); + private static void checkMessageFactory(final MessageFactory messageFactory1, final Logger testLogger1) { + if (messageFactory1 == null) { + assertEquals( + AbstractLogger.DEFAULT_MESSAGE_FACTORY_CLASS, + testLogger1.getMessageFactory().getClass()); } else { - final MessageFactory actual = testLogger.getMessageFactory(); - assertEquals(messageFactory, actual); + MessageFactory actual = testLogger1.getMessageFactory(); + if (actual instanceof MessageFactory2Adapter) { + actual = ((MessageFactory2Adapter) actual).getOriginal(); + } + assertEquals(messageFactory1, actual); } }
