This is an automated email from the ASF dual-hosted git repository.
vy pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
The following commit(s) were added to refs/heads/2.x by this push:
new c5420410df Fix `StatusLogger` log level filtering when debug mode is
enabled (#2337, #2338)
c5420410df is described below
commit c5420410df2741a7704a0efc8b77b25aca1ddea8
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Fri Mar 1 14:49:28 2024 +0100
Fix `StatusLogger` log level filtering when debug mode is enabled (#2337,
#2338)
---
.../log4j/status/StatusLoggerLevelTest.java | 82 ++++++++++++++++++++++
.../apache/logging/log4j/status/StatusLogger.java | 21 ++++--
.../.2.x.x/fix_StatusLogger_debug_mode.xml | 8 +++
3 files changed, 107 insertions(+), 4 deletions(-)
diff --git
a/log4j-api-test/src/test/java/org/apache/logging/log4j/status/StatusLoggerLevelTest.java
b/log4j-api-test/src/test/java/org/apache/logging/log4j/status/StatusLoggerLevelTest.java
index 3d58cf454a..9aa6ad9db7 100644
---
a/log4j-api-test/src/test/java/org/apache/logging/log4j/status/StatusLoggerLevelTest.java
+++
b/log4j-api-test/src/test/java/org/apache/logging/log4j/status/StatusLoggerLevelTest.java
@@ -18,12 +18,19 @@ package org.apache.logging.log4j.status;
import static
org.apache.logging.log4j.status.StatusLogger.DEFAULT_FALLBACK_LISTENER_LEVEL;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import java.util.Arrays;
import java.util.Properties;
import org.apache.logging.log4j.Level;
+import org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import uk.org.webcompere.systemstubs.SystemStubs;
class StatusLoggerLevelTest {
@@ -104,4 +111,79 @@ class StatusLoggerLevelTest {
// Verify the level
assertThat(statusLoggerConfig.fallbackListenerLevel).isEqualTo(DEFAULT_FALLBACK_LISTENER_LEVEL);
}
+
+ @ParameterizedTest
+ @ValueSource(booleans = {true, false})
+ void debug_mode_should_override_log_filtering(final boolean debugEnabled) {
+
+ // Create a logger with debug enabled
+ final StatusLogger.Config loggerConfig = new
StatusLogger.Config(debugEnabled, 0, null);
+ final Level loggerLevel = Level.ERROR;
+ final StatusConsoleListener fallbackListener =
mock(StatusConsoleListener.class);
+ when(fallbackListener.getStatusLevel()).thenReturn(loggerLevel);
+ final StatusLogger logger = new StatusLogger(
+ StatusLoggerLevelTest.class.getSimpleName(),
+ ParameterizedNoReferenceMessageFactory.INSTANCE,
+ loggerConfig,
+ fallbackListener);
+
+ // Log at all levels
+ final Level[] levels = Level.values();
+ for (final Level level : levels) {
+ logger.log(level, "test for level `{}`", level);
+ }
+
+ // Calculate the number of expected messages
+ final int expectedMessageCount;
+ if (debugEnabled) {
+ expectedMessageCount = levels.length;
+ } else {
+ expectedMessageCount = (int) Arrays.stream(levels)
+ .filter(loggerLevel::isLessSpecificThan)
+ .count();
+ }
+
+ // Verify the fallback listener invocation
+ assertThat(expectedMessageCount).isGreaterThan(0);
+ verify(fallbackListener, times(expectedMessageCount)).log(any());
+ }
+
+ @ParameterizedTest
+ @ValueSource(booleans = {true, false})
+ void debug_mode_should_override_listener_filtering(final boolean
debugEnabled) {
+
+ // Create a logger with debug enabled
+ final StatusLogger.Config loggerConfig = new
StatusLogger.Config(debugEnabled, 0, null);
+ final StatusLogger logger = new StatusLogger(
+ StatusLoggerLevelTest.class.getSimpleName(),
+ ParameterizedNoReferenceMessageFactory.INSTANCE,
+ loggerConfig,
+ new StatusConsoleListener(Level.ERROR));
+
+ // Register a listener
+ final Level listenerLevel = Level.INFO;
+ final StatusListener listener = mock(StatusListener.class);
+ when(listener.getStatusLevel()).thenReturn(listenerLevel);
+ logger.registerListener(listener);
+
+ // Log at all levels
+ final Level[] levels = Level.values();
+ for (final Level level : levels) {
+ logger.log(level, "test for level `{}`", level);
+ }
+
+ // Calculate the number of expected messages
+ final int expectedMessageCount;
+ if (debugEnabled) {
+ expectedMessageCount = levels.length;
+ } else {
+ expectedMessageCount = (int) Arrays.stream(levels)
+ .filter(listenerLevel::isLessSpecificThan)
+ .count();
+ }
+
+ // Verify the listener invocation
+ assertThat(expectedMessageCount).isGreaterThan(0);
+ verify(listener, times(expectedMessageCount)).log(any());
+ }
}
diff --git
a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
index bdebc1150a..56d9ef9862 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/status/StatusLogger.java
@@ -768,7 +768,8 @@ public class StatusLogger extends AbstractLogger {
}
private void notifyListener(final StatusListener listener, final
StatusData statusData) {
- if (config.debugEnabled ||
listener.getStatusLevel().isLessSpecificThan(statusData.getLevel())) {
+ final boolean levelEnabled = isLevelEnabled(listener.getStatusLevel(),
statusData.getLevel());
+ if (levelEnabled) {
listener.log(statusData);
}
}
@@ -963,8 +964,20 @@ public class StatusLogger extends AbstractLogger {
}
@Override
- public boolean isEnabled(final Level level, final Marker marker) {
- requireNonNull(level, "level");
- return getLevel().isLessSpecificThan(level);
+ public boolean isEnabled(final Level messageLevel, final Marker marker) {
+ requireNonNull(messageLevel, "messageLevel");
+ final Level loggerLevel = getLevel();
+ return isLevelEnabled(loggerLevel, messageLevel);
+ }
+
+ /**
+ * Checks if the message level is allowed for the filtering level (e.g.,
of logger, of listener) by taking debug mode into account.
+ *
+ * @param filteringLevel the level (e.g., of logger, of listener) to
filter messages
+ * @param messageLevel the level of the message
+ * @return {@code true}, if the sink level is less specific than the
message level; {@code false}, otherwise
+ */
+ private boolean isLevelEnabled(final Level filteringLevel, final Level
messageLevel) {
+ return config.debugEnabled ||
filteringLevel.isLessSpecificThan(messageLevel);
}
}
diff --git a/src/changelog/.2.x.x/fix_StatusLogger_debug_mode.xml
b/src/changelog/.2.x.x/fix_StatusLogger_debug_mode.xml
new file mode 100644
index 0000000000..0eafe16cbc
--- /dev/null
+++ b/src/changelog/.2.x.x/fix_StatusLogger_debug_mode.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://logging.apache.org/log4j/changelog"
+ xsi:schemaLocation="http://logging.apache.org/log4j/changelog
https://logging.apache.org/log4j/changelog-0.1.3.xsd"
+ type="fixed">
+ <issue id="2337"
link="https://github.com/apache/logging-log4j2/issues/2337"/>
+ <description format="asciidoc">Fix `StatusLogger` log level filtering when
debug mode is enabled</description>
+</entry>