You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by pk...@apache.org on 2023/01/28 11:52:04 UTC
[logging-log4j2] 02/03: [LOG4J2-3647] Fix `log4j-to-slf4j` dependency on internal package
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 <pi...@karwasz.org>
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);