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>