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/10 22:06:38 UTC

[logging-log4j2] branch master updated: [LOG4J2-3598] Lazily evaluate the level in `Log4jEventBuilder`

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


The following commit(s) were added to refs/heads/master by this push:
     new 0cc8af7458 [LOG4J2-3598] Lazily evaluate the level in `Log4jEventBuilder`
0cc8af7458 is described below

commit 0cc8af7458347d4aaf7adb23d1a8b6b248819a96
Author: Piotr P. Karwasz <pi...@karwasz.org>
AuthorDate: Wed Sep 14 20:54:33 2022 +0200

    [LOG4J2-3598] Lazily evaluate the level in `Log4jEventBuilder`
    
    To ensure maximum compatibility with Logback and the changes in SLF4J
    2.0.1 (cf. [SLF4J-560](https://jira.qos.ch/browse/SLF4J-560)) we create
    the `LogBuilder` lazily only when `log()` is called.
---
 log4j-slf4j2-impl/pom.xml                          |  2 +-
 .../apache/logging/slf4j/Log4jEventBuilder.java    | 25 ++++++++----
 .../java/org/apache/logging/slf4j/Log4jLogger.java | 46 +---------------------
 .../java/org/apache/logging/slf4j/LoggerTest.java  | 23 +++++++++++
 ...Lazily_evaluate_SLF4J_LogEventBuilder_level.xml |  7 ++++
 5 files changed, 49 insertions(+), 54 deletions(-)

diff --git a/log4j-slf4j2-impl/pom.xml b/log4j-slf4j2-impl/pom.xml
index 574f21f9e4..2393c9ed08 100644
--- a/log4j-slf4j2-impl/pom.xml
+++ b/log4j-slf4j2-impl/pom.xml
@@ -31,7 +31,7 @@
     <docLabel>SLF4J Documentation</docLabel>
     <projectDir>/slf4j2-impl</projectDir>
     <!-- Override parent's default -->
-    <slf4j.version>2.0.0</slf4j.version>
+    <slf4j.version>2.0.6</slf4j.version>
     <module.name>org.apache.logging.log4j.slf4j</module.name>
     <maven.doap.skip>true</maven.doap.skip>
   </properties>
diff --git a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jEventBuilder.java b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jEventBuilder.java
index 2d50d10747..55a4cc5aab 100644
--- a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jEventBuilder.java
+++ b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jEventBuilder.java
@@ -25,7 +25,9 @@ import java.util.function.Supplier;
 import org.apache.logging.log4j.BridgeAware;
 import org.apache.logging.log4j.CloseableThreadContext;
 import org.apache.logging.log4j.CloseableThreadContext.Instance;
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogBuilder;
+import org.apache.logging.log4j.Logger;
 import org.slf4j.Marker;
 import org.slf4j.spi.LoggingEventBuilder;
 
@@ -34,28 +36,29 @@ public class Log4jEventBuilder implements LoggingEventBuilder {
     private static final String FQCN = Log4jEventBuilder.class.getName();
 
     private final Log4jMarkerFactory markerFactory;
-    private final LogBuilder logBuilder;
+    private final Logger logger;
     private final List<Object> arguments = new ArrayList<>();
     private String message = null;
+    private org.apache.logging.log4j.Marker marker = null;
+    private Throwable throwable = null;
     private Map<String, String> keyValuePairs = null;
+    private final Level level;
 
-    public Log4jEventBuilder(final Log4jMarkerFactory markerFactory, final LogBuilder logBuilder) {
+    public Log4jEventBuilder(final Log4jMarkerFactory markerFactory, final Logger logger, final Level level) {
         this.markerFactory = markerFactory;
-        this.logBuilder = logBuilder;
-        if (logBuilder instanceof BridgeAware) {
-            ((BridgeAware) logBuilder).setEntryPoint(FQCN);
-        }
+        this.logger = logger;
+        this.level = level;
     }
 
     @Override
     public LoggingEventBuilder setCause(Throwable cause) {
-        logBuilder.withThrowable(cause);
+        this.throwable = cause;
         return this;
     }
 
     @Override
     public LoggingEventBuilder addMarker(Marker marker) {
-        logBuilder.withMarker(markerFactory.getLog4jMarker(marker));
+        this.marker = markerFactory.getLog4jMarker(marker);
         return this;
     }
 
@@ -103,6 +106,12 @@ public class Log4jEventBuilder implements LoggingEventBuilder {
 
     @Override
     public void log() {
+        final LogBuilder logBuilder = logger.atLevel(level)
+                .withMarker(marker)
+                .withThrowable(throwable);
+        if (logBuilder instanceof BridgeAware) {
+            ((BridgeAware) logBuilder).setEntryPoint(FQCN);
+        }
         if (keyValuePairs == null || keyValuePairs.isEmpty()) {
             logBuilder.log(message, arguments.toArray());
         } else {
diff --git a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java
index adff474c4f..89ca72673e 100644
--- a/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java
+++ b/log4j-slf4j2-impl/src/main/java/org/apache/logging/slf4j/Log4jLogger.java
@@ -413,50 +413,7 @@ public class Log4jLogger implements LocationAwareLogger, Serializable {
     @Override
     public LoggingEventBuilder makeLoggingEventBuilder(org.slf4j.event.Level level) {
         final Level log4jLevel = getLevel(level.toInt());
-        if (logger.isEnabled(log4jLevel)) {
-            return new Log4jEventBuilder(markerFactory, logger.atLevel(log4jLevel));
-        }
-        return NOPLoggingEventBuilder.singleton();
-    }
-
-    @Override
-    public LoggingEventBuilder atTrace() {
-        if (logger.isTraceEnabled()) {
-            return new Log4jEventBuilder(markerFactory, logger.atTrace());
-        }
-        return NOPLoggingEventBuilder.singleton();
-    }
-
-    @Override
-    public LoggingEventBuilder atDebug() {
-        if (logger.isDebugEnabled()) {
-            return new Log4jEventBuilder(markerFactory, logger.atDebug());
-        }
-        return NOPLoggingEventBuilder.singleton();
-    }
-
-    @Override
-    public LoggingEventBuilder atInfo() {
-        if (logger.isInfoEnabled()) {
-            return new Log4jEventBuilder(markerFactory, logger.atInfo());
-        }
-        return NOPLoggingEventBuilder.singleton();
-    }
-
-    @Override
-    public LoggingEventBuilder atWarn() {
-        if (logger.isWarnEnabled()) {
-            return new Log4jEventBuilder(markerFactory, logger.atWarn());
-        }
-        return NOPLoggingEventBuilder.singleton();
-    }
-
-    @Override
-    public LoggingEventBuilder atError() {
-        if (logger.isErrorEnabled()) {
-            return new Log4jEventBuilder(markerFactory, logger.atError());
-        }
-        return NOPLoggingEventBuilder.singleton();
+        return new Log4jEventBuilder(markerFactory, logger, log4jLevel);
     }
 
     @Override
@@ -464,5 +421,4 @@ public class Log4jLogger implements LocationAwareLogger, Serializable {
         return logger.isEnabled(getLevel(level.toInt()));
     }
 
-
 }
diff --git a/log4j-slf4j2-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java b/log4j-slf4j2-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
index 86096f44ac..352c94d4e4 100644
--- a/log4j-slf4j2-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
+++ b/log4j-slf4j2-impl/src/test/java/org/apache/logging/slf4j/LoggerTest.java
@@ -18,7 +18,11 @@ package org.apache.logging.slf4j;
 
 import java.util.List;
 
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configuration;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.test.appender.ListAppender;
 import org.apache.logging.log4j.core.test.junit.LoggerContextRule;
 import org.apache.logging.log4j.util.Strings;
@@ -33,7 +37,9 @@ import org.slf4j.Marker;
 import org.slf4j.ext.XLogger;
 import org.slf4j.ext.XLoggerFactory;
 import org.slf4j.spi.LocationAwareLogger;
+import org.slf4j.spi.LoggingEventBuilder;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -183,6 +189,23 @@ public class LoggerTest {
         verifyThrowable(expected);
     }
 
+    @Test
+    public void testLazyLoggingEventBuilder() {
+        final ListAppender appender = ctx.getListAppender("UnformattedList");
+        final Level oldLevel = ctx.getRootLogger().getLevel();
+        try {
+            Configurator.setRootLevel(Level.ERROR);
+            final LoggingEventBuilder builder = logger.makeLoggingEventBuilder(org.slf4j.event.Level.DEBUG);
+            Configurator.setRootLevel(Level.DEBUG);
+            builder.log();
+            assertThat(appender.getEvents()).hasSize(1)
+                    .map(LogEvent::getLevel)
+                    .containsExactly(Level.DEBUG);
+        } finally {
+            Configurator.setRootLevel(oldLevel);
+        }
+    }
+
     private ListAppender getAppenderByName(final String name) {
         final ListAppender listApp = ctx.getListAppender(name);
         assertNotNull("Missing Appender", listApp);
diff --git a/src/changelog/.2.x.x/LOG4J2-3598_Lazily_evaluate_SLF4J_LogEventBuilder_level.xml b/src/changelog/.2.x.x/LOG4J2-3598_Lazily_evaluate_SLF4J_LogEventBuilder_level.xml
new file mode 100644
index 0000000000..596e83dac0
--- /dev/null
+++ b/src/changelog/.2.x.x/LOG4J2-3598_Lazily_evaluate_SLF4J_LogEventBuilder_level.xml
@@ -0,0 +1,7 @@
+<entry type="fixed">
+  <issue id="LOG4J2-3598" link="https://issues.apache.org/jira/browse/LOG4J2-3598"/>
+  <author id="pkarwasz"/>
+  <description format="asciidoc">
+    Lazily evaluate the level of a SLF4J `LogEventBuilder`.
+  </description>
+</entry>