This is an automated email from the ASF dual-hosted git repository. pkarwasz pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 1ed4901b02fe75943d19f550c557a35757d505c6 Author: Piotr P. Karwasz <[email protected]> AuthorDate: Sat Jan 14 15:09:35 2023 +0100 [LOG4J2-3647] Fix `log4j-to-slf4j` dependency on internal package Reimplements the log builder used in `log4j-to-slf4j` so that it does not depend on an internal `log4j-api` package. --- .../logging/log4j/osgi/tests/JULProviderTest.java | 2 +- .../log4j/osgi/tests/SLF4JProviderTest.java | 2 +- .../org/apache/logging/slf4j/SLF4JLogBuilder.java | 229 ++++++++++++++++----- .../java/org/apache/logging/slf4j/SLF4JLogger.java | 5 + 4 files changed, 182 insertions(+), 56 deletions(-) diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/JULProviderTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/JULProviderTest.java index 49e0587072..c6751fd1a4 100644 --- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/JULProviderTest.java +++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/JULProviderTest.java @@ -58,7 +58,7 @@ public class JULProviderTest { junitBundles()); } - @Test + @Test(timeout = 10_000L) public void testJulFactoryResolves() { final Optional<Bundle> julBundle = Stream.of(context.getBundles()) .filter(b -> "org.apache.logging.log4j.to-jul".equals(b.getSymbolicName())) diff --git a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/SLF4JProviderTest.java b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/SLF4JProviderTest.java index 7f46786978..371d3d0dae 100644 --- a/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/SLF4JProviderTest.java +++ b/log4j-osgi/src/test/java/org/apache/logging/log4j/osgi/tests/SLF4JProviderTest.java @@ -57,7 +57,7 @@ public class SLF4JProviderTest { junitBundles()); } - @Test + @Test(timeout = 10_000L) public void testSlf4jFactoryResolves() { final Optional<Bundle> slf4jBundle = Stream.of(context.getBundles()) .filter(b -> "org.apache.logging.log4j.to-slf4j".equals(b.getSymbolicName())) diff --git a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogBuilder.java b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogBuilder.java index ad978fb4b9..a910694d68 100644 --- a/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogBuilder.java +++ b/log4j-to-slf4j/src/main/java/org/apache/logging/slf4j/SLF4JLogBuilder.java @@ -17,112 +17,233 @@ package org.apache.logging.slf4j; import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.internal.DefaultLogBuilder; +import org.apache.logging.log4j.LogBuilder; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.message.SimpleMessage; import org.apache.logging.log4j.spi.ExtendedLogger; +import org.apache.logging.log4j.status.StatusLogger; +import org.apache.logging.log4j.util.LambdaUtil; +import org.apache.logging.log4j.util.StackLocatorUtil; +import org.apache.logging.log4j.util.Supplier; -public class SLF4JLogBuilder extends DefaultLogBuilder { +public class SLF4JLogBuilder implements LogBuilder { - public SLF4JLogBuilder(ExtendedLogger logger, Level level) { - super(logger, level); + private static Message EMPTY_MESSAGE = new SimpleMessage(""); + private static final String FQCN = SLF4JLogBuilder.class.getName(); + private static final Logger LOGGER = StatusLogger.getLogger(); + + private ExtendedLogger logger; + private Level level; + private Marker marker; + private Throwable throwable; + private volatile boolean inUse; + private final long threadId; + + public SLF4JLogBuilder(SLF4JLogger logger, Level level) { + this.logger = logger; + this.level = level; + this.threadId = Thread.currentThread().getId(); + this.inUse = level != null; } public SLF4JLogBuilder() { - super(); + this(null, null); } - @Override - protected boolean isEnabled(Message message) { - // SLF4J will check again later + public LogBuilder reset(SLF4JLogger logger, Level level) { + this.logger = logger; + this.level = level; + this.marker = null; + this.throwable = null; + this.inUse = true; + return this; + } + + public boolean isInUse() { + return this.inUse; + } + + private boolean isValid() { + if (!inUse) { + LOGGER.warn("Attempt to reuse LogBuilder was ignored. {}", StackLocatorUtil.getCallerClass(2)); + return false; + } + if (this.threadId != Thread.currentThread().getId()) { + LOGGER.warn("LogBuilder can only be used on the owning thread. {}", StackLocatorUtil.getCallerClass(2)); + return false; + } return true; } + private void logMessage(Message message) { + try { + logger.logMessage(FQCN, level, marker, message, throwable); + } finally { + inUse = false; + } + } + @Override - protected boolean isEnabled(CharSequence message) { - // SLF4J will check again later - return true; + public LogBuilder withMarker(Marker marker) { + this.marker = marker; + return this; } @Override - protected boolean isEnabled(String message) { - // SLF4J will check again later - return true; + public LogBuilder withThrowable(Throwable throwable) { + this.throwable = throwable; + return this; } @Override - protected boolean isEnabled(String message, Object... params) { - // SLF4J will check again later - return true; + public LogBuilder withLocation() { + LOGGER.info("Call to withLocation() ignored since SLF4J does not support setting location information."); + return this; } @Override - protected boolean isEnabled(Object message) { - // SLF4J will check again later - return true; + public LogBuilder withLocation(StackTraceElement location) { + return withLocation(); } @Override - protected boolean isEnabled(String message, Object p0) { - // SLF4J will check again later - return true; + public void log(CharSequence message) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message)); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1) { - // SLF4J will check again later - return true; + public void log(String message) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message)); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2) { - // SLF4J will check again later - return true; + public void log(String message, Object... params) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, params)); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3) { - // SLF4J will check again later - return true; + public void log(String message, Supplier<?>... params) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, LambdaUtil.getAll(params))); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3, Object p4) { - // SLF4J will check again later - return true; + public void log(Message message) { + if (isValid()) { + logMessage(message); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) { - // SLF4J will check again later - return true; + public void log(Supplier<Message> messageSupplier) { + if (isValid()) { + logMessage(messageSupplier.get()); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, - Object p6) { - // SLF4J will check again later - return true; + public Message logAndGet(Supplier<Message> messageSupplier) { + Message message = null; + if (isValid()) { + logMessage(message = messageSupplier.get()); + } + return message; } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, - Object p6, Object p7) { - // SLF4J will check again later - return true; + public void log(Object message) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message)); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, - Object p6, Object p7, Object p8) { - // SLF4J will check again later - return true; + public void log(String message, Object p0) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0)); + } } @Override - protected boolean isEnabled(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, - Object p6, Object p7, Object p8, Object p9) { - // SLF4J will check again later - return true; + public void log(String message, Object p0, Object p1) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3, Object p4) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3, p4)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3, p4, p5)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3, p4, p5, p6)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, + Object p7) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, + Object p7, Object p8) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7, p8)); + } + } + + @Override + public void log(String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, Object p6, + Object p7, Object p8, Object p9) { + if (isValid()) { + logMessage(logger.getMessageFactory().newMessage(message, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)); + } + } + + @Override + public void log() { + if (isValid()) { + logMessage(EMPTY_MESSAGE); + } } } 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 fd8bbde404..f647fc3766 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 @@ -270,6 +270,11 @@ public class SLF4JLogger extends AbstractLogger { } } + @Override + public LogBuilder always() { + return atLevel(Level.OFF); + } + @Override public LogBuilder atTrace() { return atLevel(Level.TRACE);
