Skip to content

Commit f53fca1

Browse files
committed
Fix behavior of CoreLogger#getLevel
1 parent 1755087 commit f53fca1

File tree

4 files changed

+79
-77
lines changed

4 files changed

+79
-77
lines changed

log4j-jul/src/main/java/org/apache/logging/log4j/jul/ApiLogger.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
package org.apache.logging.log4j.jul;
1818

19-
import java.security.AccessController;
20-
import java.security.PrivilegedAction;
2119
import java.util.logging.Filter;
2220
import java.util.logging.Level;
2321
import java.util.logging.LogRecord;
@@ -48,12 +46,6 @@ public class ApiLogger extends Logger {
4846

4947
ApiLogger(final ExtendedLogger logger) {
5048
super(logger.getName(), null);
51-
final Level javaLevel = LevelTranslator.toJavaLevel(logger.getLevel());
52-
// "java.util.logging.LoggingPermission" "control"
53-
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
54-
ApiLogger.super.setLevel(javaLevel);
55-
return null;
56-
});
5749
this.logger = new WrappedLogger(logger);
5850
}
5951

@@ -88,6 +80,13 @@ public String getName() {
8880
return logger.getName();
8981
}
9082

83+
@Override
84+
public Level getLevel() {
85+
// Returns the effective level instead of the configured one.
86+
// The configured level is not accessible through Log4j API.
87+
return LevelTranslator.toJavaLevel(logger.getLevel());
88+
}
89+
9190
@Override
9291
public void setLevel(final Level newLevel) throws SecurityException {
9392
StatusLogger.getLogger()

log4j-jul/src/main/java/org/apache/logging/log4j/jul/CoreLogger.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.logging.Level;
2020
import java.util.logging.Logger;
2121
import org.apache.logging.log4j.core.config.Configurator;
22+
import org.apache.logging.log4j.core.config.LoggerConfig;
2223

2324
/**
2425
* Log4j Core implementation of the JUL {@link Logger} class. <strong>Note that this implementation does
@@ -42,9 +43,17 @@ public class CoreLogger extends ApiLogger {
4243
this.logger = logger;
4344
}
4445

46+
@Override
47+
public Level getLevel() {
48+
final LoggerConfig config = logger.get();
49+
return config.getName().equals(logger.getName())
50+
? LevelTranslator.toJavaLevel(config.getExplicitLevel())
51+
: null;
52+
}
53+
4554
@Override
4655
public void setLevel(final Level level) throws SecurityException {
47-
super.doSetLevel(level); // checks permissions
56+
doSetLevel(level); // checks permissions
4857
Configurator.setLevel(logger, LevelTranslator.toLevel(level));
4958
}
5059

log4j-jul/src/test/java/org/apache/logging/log4j/jul/test/CoreLoggerTest.java

Lines changed: 61 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,11 @@
1616
*/
1717
package org.apache.logging.log4j.jul.test;
1818

19-
import static org.hamcrest.Matchers.equalTo;
20-
import static org.hamcrest.Matchers.is;
21-
import static org.junit.Assert.assertEquals;
22-
import static org.junit.Assert.assertNotNull;
23-
import static org.junit.Assert.assertThat;
24-
import static org.junit.Assert.assertTrue;
19+
import static org.assertj.core.api.Assertions.assertThat;
2520

2621
import java.util.logging.Level;
2722
import java.util.logging.Logger;
23+
import org.apache.logging.log4j.core.LoggerContext;
2824
import org.apache.logging.log4j.core.test.appender.ListAppender;
2925
import org.apache.logging.log4j.jul.LogManager;
3026
import org.apache.logging.log4j.util.Strings;
@@ -36,6 +32,27 @@
3632

3733
public class CoreLoggerTest extends AbstractLoggerTest {
3834

35+
private static final Level[] LEVELS = new Level[] {
36+
Level.ALL,
37+
Level.FINEST,
38+
Level.FINER,
39+
Level.FINE,
40+
Level.CONFIG,
41+
Level.INFO,
42+
Level.WARNING,
43+
Level.SEVERE,
44+
Level.OFF
45+
};
46+
47+
private static Level getEffectiveLevel(final Logger logger) {
48+
for (final Level level : LEVELS) {
49+
if (logger.isLoggable(level)) {
50+
return level;
51+
}
52+
}
53+
throw new RuntimeException("No level is enabled.");
54+
}
55+
3956
@BeforeClass
4057
public static void setUpClass() {
4158
System.setProperty("java.util.logging.manager", LogManager.class.getName());
@@ -47,21 +64,23 @@ public static void tearDownClass() {
4764
}
4865

4966
@Before
50-
public void setUp() throws Exception {
51-
LogManager.getLogManager().reset();
67+
public void setUp() {
68+
// Reset the logger context
69+
LoggerContext.getContext(false).reconfigure();
70+
5271
logger = Logger.getLogger(LOGGER_NAME);
5372
logger.setFilter(null);
54-
assertThat(logger.getLevel(), equalTo(Level.FINE));
73+
assertThat(logger.getLevel()).isEqualTo(Level.FINE);
5574
eventAppender = ListAppender.getListAppender("TestAppender");
5675
flowAppender = ListAppender.getListAppender("FlowAppender");
5776
stringAppender = ListAppender.getListAppender("StringAppender");
58-
assertNotNull(eventAppender);
59-
assertNotNull(flowAppender);
60-
assertNotNull(stringAppender);
77+
assertThat(eventAppender).isNotNull();
78+
assertThat(flowAppender).isNotNull();
79+
assertThat(stringAppender).isNotNull();
6180
}
6281

6382
@After
64-
public void tearDown() throws Exception {
83+
public void tearDown() {
6584
if (eventAppender != null) {
6685
eventAppender.clear();
6786
}
@@ -74,82 +93,57 @@ public void tearDown() throws Exception {
7493
}
7594

7695
@Test
77-
public void testRootSetLevelToNull() throws Exception {
96+
public void testRootSetLevelToNull() {
7897
final Logger rootLogger = Logger.getLogger(Strings.EMPTY);
79-
assertThat(rootLogger.getLevel(), equalTo(Level.SEVERE));
80-
assertThat(rootLogger.isLoggable(Level.SEVERE), is(true));
98+
assertThat(rootLogger.getLevel()).isEqualTo(Level.SEVERE);
99+
assertThat(getEffectiveLevel(rootLogger)).isEqualTo(Level.SEVERE);
81100
// null test
82101
rootLogger.setLevel(null);
83-
assertThat(rootLogger.getLevel(), equalTo(null));
84-
assertThat(rootLogger.isLoggable(Level.SEVERE), is(true));
102+
assertThat(rootLogger.getLevel()).isNull();
103+
assertThat(getEffectiveLevel(rootLogger)).isEqualTo(Level.SEVERE);
85104
// now go back to a different one
86105
rootLogger.setLevel(Level.INFO);
87-
assertThat(rootLogger.getLevel(), equalTo(Level.INFO));
88-
assertThat(rootLogger.isLoggable(Level.FINE), is(false));
106+
assertThat(rootLogger.getLevel()).isEqualTo(Level.INFO);
107+
assertThat(getEffectiveLevel(rootLogger)).isEqualTo(Level.INFO);
89108
}
90109

91110
@Test
92-
public void testSetLevel() throws Exception {
93-
final Logger childLogger = Logger.getLogger(LOGGER_NAME + ".Child");
94-
assertThat(childLogger.getLevel(), equalTo(Level.FINE));
95-
logger.setLevel(Level.SEVERE);
96-
assertThat(childLogger.getLevel(), equalTo(Level.FINE));
97-
assertThat(logger.getLevel(), equalTo(Level.SEVERE));
98-
logger.setLevel(Level.FINER);
99-
assertThat(logger.getLevel(), equalTo(Level.FINER));
100-
logger.setLevel(Level.FINE);
101-
assertThat(logger.getLevel(), equalTo(Level.FINE));
102-
assertThat(childLogger.getLevel(), equalTo(Level.FINE));
103-
assertThat(childLogger.isLoggable(Level.ALL), is(false));
104-
}
105-
106-
@Test
107-
public void testSetLevelIssue2281() {
111+
public void testSetLevel() {
108112
final Logger a = Logger.getLogger("a");
109113
final Logger a_b = Logger.getLogger("a.b");
110114
final Logger a_b_c = Logger.getLogger("a.b.c");
111115
// test default for this test
112-
assertEquals(Level.INFO, a.getLevel());
113-
assertEquals(Level.INFO, a_b.getLevel());
114-
assertEquals(Level.INFO, a_b_c.getLevel());
116+
assertThat(a.getLevel()).isNull();
117+
assertThat(a_b.getLevel()).isNull();
118+
assertThat(a_b_c.getLevel()).isNull();
115119
// all levels
116-
final Level[] levels = new Level[] {
117-
Level.OFF,
118-
Level.SEVERE,
119-
Level.WARNING,
120-
Level.INFO,
121-
Level.CONFIG,
122-
Level.FINE,
123-
Level.FINER,
124-
Level.FINEST,
125-
Level.ALL
126-
};
127-
for (int i = 0; i < levels.length - 1; i++) {
128-
final Level level = levels[i];
129-
final Level nextLevel = levels[i + 1];
120+
for (final Level level : LEVELS) {
130121
a.setLevel(level);
131-
assertEquals(level, a.getLevel());
132-
assertTrue(a.isLoggable(level) && !a.isLoggable(nextLevel));
133-
assertTrue(a_b.isLoggable(level) && !a.isLoggable(nextLevel));
134-
assertTrue(a_b_c.isLoggable(level) && !a.isLoggable(nextLevel));
122+
assertThat(a.getLevel()).isEqualTo(level);
123+
assertThat(getEffectiveLevel(a)).isEqualTo(level);
124+
assertThat(a_b.getLevel()).isNull();
125+
assertThat(getEffectiveLevel(a_b)).isEqualTo(level);
126+
assertThat(a_b_c.getLevel()).isNull();
127+
assertThat(getEffectiveLevel(a_b_c)).isEqualTo(level);
135128
}
136129
}
137130

138131
@Test
139-
public void testSetLevelToNull() throws Exception {
132+
public void testSetLevelToNull() {
140133
final Logger childLogger = Logger.getLogger(LOGGER_NAME + ".NullChild");
141-
assertThat(childLogger.getLevel(), equalTo(Level.FINE));
142-
assertThat(childLogger.isLoggable(Level.FINE), is(true));
134+
assertThat(childLogger.getLevel()).isNull();
135+
assertThat(getEffectiveLevel(childLogger)).isEqualTo(Level.FINE);
136+
// Set explicit level
143137
childLogger.setLevel(Level.SEVERE);
144-
assertThat(childLogger.getLevel(), equalTo(Level.SEVERE));
145-
assertThat(childLogger.isLoggable(Level.FINE), is(false));
146-
// null test
138+
assertThat(childLogger.getLevel()).isEqualTo(Level.SEVERE);
139+
assertThat(getEffectiveLevel(childLogger)).isEqualTo(Level.SEVERE);
140+
// Set null level
147141
childLogger.setLevel(null);
148-
assertThat(childLogger.getLevel(), equalTo(null));
149-
assertThat(childLogger.isLoggable(Level.FINE), is(true));
142+
assertThat(childLogger.getLevel()).isNull();
143+
assertThat(getEffectiveLevel(childLogger)).isEqualTo(Level.FINE);
150144
// now go back
151145
childLogger.setLevel(Level.SEVERE);
152-
assertThat(childLogger.getLevel(), equalTo(Level.SEVERE));
153-
assertThat(childLogger.isLoggable(Level.FINE), is(false));
146+
assertThat(childLogger.getLevel()).isEqualTo(Level.SEVERE);
147+
assertThat(getEffectiveLevel(childLogger)).isEqualTo(Level.SEVERE);
154148
}
155149
}

src/changelog/.2.x.x/2282_fix_jul_set_level.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
type="fixed">
66
<issue id="2282" link="https://github.com/apache/logging-log4j2/issues/2282"/>
77
<description format="asciidoc">
8-
Fix the behavior of `CoreLogger#setLevel` in the log4j-jul module.
8+
Fix the behavior of `CoreLogger#getLevel` and `CoreLogger#setLevel` in the `log4j-jul` module.
99
</description>
1010
</entry>

0 commit comments

Comments
 (0)