This is an automated email from the ASF dual-hosted git repository.
ggregory 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 0ecf6e1070 The core.Logger#setLevel method should work like (#2282)
0ecf6e1070 is described below
commit 0ecf6e1070820fe9829921880cf71c0b3eaea1c7
Author: Gary Gregory <[email protected]>
AuthorDate: Wed Feb 14 07:30:06 2024 -0500
The core.Logger#setLevel method should work like (#2282)
* The core.Logger#setLevel method should work like
Configurator#setLevel #2281
* Fix `Logger#setLevel` to work as in Log4j 1.2
---------
Co-authored-by: Piotr P. Karwasz <[email protected]>
---
.../src/main/java/org/apache/log4j/Category.java | 26 ++--------
.../org/apache/log4j/helpers/OptionConverter.java | 26 ++++++++--
.../org/apache/log4j/legacy/core/CategoryUtil.java | 18 ++++++-
.../src/test/java/org/apache/log4j/LoggerTest.java | 58 ++++++++++++++++++++--
.../log4j/helpers/OptionConverterLevelTest.java | 15 +++---
pom.xml | 1 +
src/changelog/.2.x.x/2282_fix_1_2_set_level.xml | 10 ++++
7 files changed, 115 insertions(+), 39 deletions(-)
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
index 7d3014b23f..a81409c024 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/Category.java
@@ -29,6 +29,7 @@ import org.apache.log4j.bridge.AppenderWrapper;
import org.apache.log4j.bridge.LogEventWrapper;
import org.apache.log4j.helpers.AppenderAttachableImpl;
import org.apache.log4j.helpers.NullEnumeration;
+import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.legacy.core.CategoryUtil;
import org.apache.log4j.spi.AppenderAttachable;
import org.apache.log4j.spi.HierarchyEventListener;
@@ -384,25 +385,7 @@ public class Category implements AppenderAttachable {
}
public Level getEffectiveLevel() {
- switch (logger.getLevel().getStandardLevel()) {
- case ALL:
- return Level.ALL;
- case TRACE:
- return Level.TRACE;
- case DEBUG:
- return Level.DEBUG;
- case INFO:
- return Level.INFO;
- case WARN:
- return Level.WARN;
- case ERROR:
- return Level.ERROR;
- case FATAL:
- return Level.FATAL;
- default:
- // TODO Should this be an IllegalStateException?
- return Level.OFF;
- }
+ return OptionConverter.convertLevel(logger.getLevel());
}
/**
@@ -417,7 +400,8 @@ public class Category implements AppenderAttachable {
}
public final Level getLevel() {
- return getEffectiveLevel();
+ final org.apache.logging.log4j.Level v2Level =
CategoryUtil.getExplicitLevel(logger);
+ return v2Level != null ? OptionConverter.convertLevel(v2Level) : null;
}
private String getLevelStr(final Priority priority) {
@@ -460,7 +444,7 @@ public class Category implements AppenderAttachable {
}
public final Level getPriority() {
- return getEffectiveLevel();
+ return getLevel();
}
public ResourceBundle getResourceBundle() {
diff --git
a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
index eea6bc673d..bc875512fa 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/helpers/OptionConverter.java
@@ -630,16 +630,36 @@ public class OptionConverter {
return null;
}
- LOGGER.debug("toLevel" + ":class=[" + clazz + "]" + ":pri=[" +
levelName + "]");
+ LOGGER.debug("toLevel:class=[{}]:pri=[{}]", clazz, levelName);
// Support for levels defined in Log4j2.
if (LOG4J2_LEVEL_CLASS.equals(clazz)) {
final org.apache.logging.log4j.Level v2Level =
org.apache.logging.log4j.Level.getLevel(toRootUpperCase(levelName));
if (v2Level != null) {
- return new LevelWrapper(v2Level);
+ switch (v2Level.name()) {
+ case "ALL":
+ return Level.ALL;
+ case "DEBUG":
+ return Level.DEBUG;
+ case "ERROR":
+ return Level.ERROR;
+ case "FATAL":
+ return Level.FATAL;
+ case "INFO":
+ return Level.INFO;
+ case "OFF":
+ return Level.OFF;
+ case "WARN":
+ return Level.WARN;
+ case "TRACE":
+ return Level.TRACE;
+ default:
+ return new LevelWrapper(v2Level);
+ }
+ } else {
+ return defaultValue;
}
- return defaultValue;
}
try {
final Class<?> customLevel = LoaderUtil.loadClass(clazz);
diff --git
a/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
b/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
index ee31ff5380..d85c4c732a 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/legacy/core/CategoryUtil.java
@@ -27,6 +27,7 @@ import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.LoggerConfig;
import org.apache.logging.log4j.spi.LoggerContext;
@@ -127,10 +128,25 @@ public final class CategoryUtil {
*/
public static void setLevel(final Logger logger, final Level level) {
if (isCore(logger)) {
- asCore(logger).setLevel(level);
+ Configurator.setLevel(asCore(logger), level);
}
}
+ /**
+ * Returns the level explicitly set on the logger.
+ * <p>
+ * If the Log4j API implementation does not support it, returns the
effective level instead.
+ * </p>
+ */
+ public static Level getExplicitLevel(final Logger logger) {
+ return isCore(logger) ? getExplicitLevel(asCore(logger)) :
logger.getLevel();
+ }
+
+ private static Level getExplicitLevel(final
org.apache.logging.log4j.core.Logger logger) {
+ final LoggerConfig config = logger.get();
+ return config.getName().equals(logger.getName()) ?
config.getExplicitLevel() : null;
+ }
+
/**
* Adds an appender to the logger. This method requires a check for the
presence
* of Log4j Core or it will cause a {@code ClassNotFoundException}.
diff --git a/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
b/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
index 55d5432111..c796214b46 100644
--- a/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
+++ b/log4j-1.2-api/src/test/java/org/apache/log4j/LoggerTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.log4j;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -25,17 +26,17 @@ import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
import java.util.ResourceBundle;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.AbstractAppender;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.core.test.appender.ListAppender;
-import org.junit.After;
import org.junit.AfterClass;
+import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
@@ -75,9 +76,9 @@ public class LoggerTest {
ConfigurationFactory.removeConfigurationFactory(configurationFactory);
}
- @After
- public void tearDown() {
- LoggerContext.getContext().reconfigure();
+ @Before
+ public void resetTest() {
+ Objects.requireNonNull(LogManager.getHierarchy()).resetConfiguration();
a1 = null;
a2 = null;
}
@@ -493,6 +494,53 @@ public class LoggerTest {
}
}
+ @Test
+ public void testSetLevel() {
+ final Logger a = Logger.getLogger("a");
+ final Logger a_b = Logger.getLogger("a.b");
+ final Logger a_b_c = Logger.getLogger("a.b.c");
+ // test default for this test
+ assertThat(a.getLevel()).isNull();
+ assertThat(a_b.getLevel()).isNull();
+ assertThat(a_b_c.getLevel()).isNull();
+ assertThat(a.getEffectiveLevel()).isEqualTo(Level.DEBUG);
+ assertThat(a_b.getEffectiveLevel()).isEqualTo(Level.DEBUG);
+ assertThat(a_b_c.getEffectiveLevel()).isEqualTo(Level.DEBUG);
+ // all
+ for (final Level level :
+ new Level[] {Level.DEBUG, Level.ERROR, Level.FATAL,
Level.INFO, Level.TRACE, Level.WARN}) {
+ a.setLevel(level);
+ assertThat(a.getLevel()).isEqualTo(level);
+ assertThat(a_b.getLevel()).isNull();
+ assertThat(a_b.getEffectiveLevel()).isEqualTo(level);
+ assertThat(a_b.getLevel()).isNull();
+ assertThat(a_b_c.getEffectiveLevel()).isEqualTo(level);
+ }
+ }
+
+ @Test
+ public void testSetPriority() {
+ final Logger a = Logger.getLogger("a");
+ final Logger a_b = Logger.getLogger("a.b");
+ final Logger a_b_c = Logger.getLogger("a.b.c");
+ // test default for this test
+ assertThat(a.getPriority()).isNull();
+ assertThat(a_b.getPriority()).isNull();
+ assertThat(a_b_c.getPriority()).isNull();
+ assertThat(a.getEffectiveLevel()).isEqualTo(Level.DEBUG);
+ assertThat(a_b.getEffectiveLevel()).isEqualTo(Level.DEBUG);
+ assertThat(a_b_c.getEffectiveLevel()).isEqualTo(Level.DEBUG);
+ // all
+ for (final Priority level : Level.getAllPossiblePriorities()) {
+ a.setPriority(level);
+ assertThat(a.getPriority()).isEqualTo(level);
+ assertThat(a_b.getPriority()).isNull();
+ assertThat(a_b.getEffectiveLevel()).isEqualTo(level);
+ assertThat(a_b.getPriority()).isNull();
+ assertThat(a_b_c.getEffectiveLevel()).isEqualTo(level);
+ }
+ }
+
private static class MyLogger {
private final Logger logger;
diff --git
a/log4j-1.2-api/src/test/java/org/apache/log4j/helpers/OptionConverterLevelTest.java
b/log4j-1.2-api/src/test/java/org/apache/log4j/helpers/OptionConverterLevelTest.java
index 7037562126..65a1cb69c5 100644
---
a/log4j-1.2-api/src/test/java/org/apache/log4j/helpers/OptionConverterLevelTest.java
+++
b/log4j-1.2-api/src/test/java/org/apache/log4j/helpers/OptionConverterLevelTest.java
@@ -18,9 +18,10 @@ package org.apache.log4j.helpers;
import static org.apache.log4j.helpers.OptionConverter.toLog4j1Level;
import static org.apache.log4j.helpers.OptionConverter.toLog4j2Level;
-import static org.junit.Assert.assertNull;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
import java.util.Arrays;
import java.util.stream.Stream;
@@ -43,22 +44,18 @@ public class OptionConverterLevelTest {
/**
* Test if the standard levels are transformed correctly.
- *
- * @param log4j1Level
- * @param log4j2Level
*/
@ParameterizedTest
@MethodSource("standardLevels")
public void testStandardLevelConversion(final Level log4j1Level, final
org.apache.logging.log4j.Level log4j2Level) {
- assertEquals(log4j2Level, OptionConverter.convertLevel(log4j1Level));
- assertEquals(log4j1Level, OptionConverter.convertLevel(log4j2Level));
+
assertThat(log4j2Level).isSameAs(OptionConverter.convertLevel(log4j1Level));
+
assertThat(log4j1Level).isSameAs(OptionConverter.convertLevel(log4j2Level));
+
assertThat(OptionConverter.toLevel(org.apache.logging.log4j.Level.class.getName(),
log4j2Level.name(), null))
+ .isSameAs(OptionConverter.convertLevel(log4j2Level));
}
/**
* Test if the conversion works at an integer level.
- *
- * @param log4j1Level
- * @param log4j2Level
*/
@ParameterizedTest
@MethodSource("standardLevels")
diff --git a/pom.xml b/pom.xml
index 035fc1d236..18e2be83d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -542,6 +542,7 @@
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
+ <version>0.16.1</version>
<configuration>
<consoleOutput>true</consoleOutput>
<excludes combine.children="append">
diff --git a/src/changelog/.2.x.x/2282_fix_1_2_set_level.xml
b/src/changelog/.2.x.x/2282_fix_1_2_set_level.xml
new file mode 100644
index 0000000000..1a5afb5d0a
--- /dev/null
+++ b/src/changelog/.2.x.x/2282_fix_1_2_set_level.xml
@@ -0,0 +1,10 @@
+<?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.2.xsd"
+ type="fixed">
+ <issue id="2282"
link="https://github.com/apache/logging-log4j2/issues/2282"/>
+ <description format="asciidoc">
+ Fix the behavior of `Logger#setLevel` and `Logger#getLevel` in the Log4j
1.2 bridge.
+ </description>
+</entry>