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);