Skip to content

Commit 7ddc863

Browse files
authored
Merge pull request #2 from avaje/feature/dynamic-log-level-debug
Add support for debug logging when dynamically changing log levels
2 parents 00b7a8e + 07d8d73 commit 7ddc863

File tree

6 files changed

+62
-9
lines changed

6 files changed

+62
-9
lines changed

avaje-simple-json-logger/src/main/java/io/avaje/simplelogger/LoggerContext.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ static LoggerContext get() {
2424

2525
/**
2626
* Apply a set of name log level pairs and update log levels for all impacted loggers.
27+
*
28+
* @return Map of changed loggers and their new levels.
2729
*/
28-
void putAll(Map<String, String> nameLevels);
30+
Map<String, String> putAll(Map<String, String> nameLevels);
2931
}

avaje-simple-json-logger/src/main/java/io/avaje/simplelogger/encoder/SimpleLogger.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ final class SimpleLogger extends LegacyAbstractLogger {
1919
this.level = level;
2020
}
2121

22-
void setNewLevel(int newLevel) {
22+
boolean setNewLevel(int newLevel) {
2323
// atomic assignment
24-
this.level = newLevel;
24+
final boolean changed = level != newLevel;
25+
level = newLevel;
26+
return changed;
2527
}
2628

2729
@Override

avaje-simple-json-logger/src/main/java/io/avaje/simplelogger/encoder/SimpleLoggerFactory.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.slf4j.spi.LocationAwareLogger;
66

77
import java.util.Map;
8+
import java.util.TreeMap;
89
import java.util.concurrent.ConcurrentHashMap;
910
import java.util.concurrent.ConcurrentMap;
1011

@@ -46,16 +47,40 @@ static int stringToLevel(String levelStr) {
4647
return LocationAwareLogger.INFO_INT;
4748
}
4849

50+
static String level(int level) {
51+
switch (level) {
52+
case LocationAwareLogger.TRACE_INT:
53+
return "trace";
54+
case LocationAwareLogger.DEBUG_INT:
55+
return "debug";
56+
case LocationAwareLogger.INFO_INT:
57+
return "info";
58+
case LocationAwareLogger.WARN_INT:
59+
return "warn";
60+
case LocationAwareLogger.ERROR_INT:
61+
return "error";
62+
case LOG_LEVEL_OFF:
63+
return "off";
64+
default:
65+
return "Level" + level;
66+
}
67+
}
68+
4969
@Override
50-
public void putAll(Map<String, String> nameLevels) {
70+
public Map<String, String> putAll(Map<String, String> nameLevels) {
5171
nameLevels.forEach(this::putLevel);
5272

73+
final Map<String, String> changed = new TreeMap<>();
5374
for (Map.Entry<String, SimpleLogger> entry : loggerMap.entrySet()) {
5475
final String key = entry.getKey();
5576
if (adjustedKey(key, nameLevels)) {
56-
entry.getValue().setNewLevel(level(key));
77+
int newLevel = level(key);
78+
if (entry.getValue().setNewLevel(newLevel)) {
79+
changed.put(key, level(newLevel));
80+
}
5781
}
5882
}
83+
return changed;
5984
}
6085

6186
private boolean adjustedKey(String key, Map<String, String> nameLevels) {

avaje-simple-logger/src/main/java/io/avaje/simplelogger/dynamic/DynamicLogLevels.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import io.avaje.config.ConfigurationPlugin;
55
import io.avaje.config.ModificationEvent;
66
import io.avaje.simplelogger.LoggerContext;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
79

810
import java.util.HashMap;
911
import java.util.Map;
@@ -13,6 +15,8 @@
1315
*/
1416
public final class DynamicLogLevels implements ConfigurationPlugin {
1517

18+
private static final Logger log = LoggerFactory.getLogger("io.avaje.simplelogger");
19+
1620
private static String trimKey(String key) {
1721
return key.substring(10);
1822
}
@@ -24,11 +28,14 @@ public void apply(Configuration configuration) {
2428
for (String key : config.keys()) {
2529
String rawLevel = config.getNullable(key);
2630
if (rawLevel != null) {
27-
nameLevels.put(trimKey(key), rawLevel);
31+
nameLevels.put(key, rawLevel);
2832
}
2933
}
3034
if (!nameLevels.isEmpty()) {
31-
LoggerContext.get().putAll(nameLevels);
35+
var changed = LoggerContext.get().putAll(nameLevels);
36+
log.debug("apply log levels:{} changed loggers:{}", nameLevels, changed);
37+
} else {
38+
log.debug("dynamic log levels enabled");
3239
}
3340

3441
configuration.onChange(this::onChangeAny);
@@ -47,7 +54,8 @@ private void onChangeAny(ModificationEvent modificationEvent) {
4754
});
4855

4956
if (!nameLevels.isEmpty()) {
50-
LoggerContext.get().putAll(nameLevels);
57+
var changed = LoggerContext.get().putAll(nameLevels);
58+
log.debug("apply log levels:{} changed loggers:{}", nameLevels, changed);
5159
}
5260
}
5361

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,42 @@
11
package io.avaje.simplelogger.dynamic;
22

33

4+
import io.avaje.config.Config;
5+
import io.avaje.config.Configuration;
46
import io.avaje.simplelogger.LoggerContext;
57
import org.junit.jupiter.api.Test;
68
import org.slf4j.Logger;
79
import org.slf4j.LoggerFactory;
810

911
import java.util.Map;
1012

13+
import static org.assertj.core.api.Assertions.assertThat;
14+
1115
class DynamicLogLevelsTest {
1216

1317
static final Logger logFoo = LoggerFactory.getLogger("org.foo.MyFoo");
1418
static final Logger logBar = LoggerFactory.getLogger("org.bar.extra.MyBar");
1519

1620
@Test
1721
void test() {
22+
Configuration configuration = Config.asConfiguration();
23+
assertThat(configuration).isNotNull();
24+
1825
logFoo.debug("hi foo");
1926
logBar.debug("hi bar before");
2027

2128
LoggerContext.get()
2229
.putAll(Map.of("org.bar.extra", "trace"));
2330

2431
logBar.debug("hi bar after log level change");
32+
33+
configuration.putAll(Map.of(
34+
"junk", "junk",
35+
"log.level.org.foo", "debug",
36+
"log.level.org.bar.extra", "warn"));
37+
38+
logBar.debug("hi bar after dynamic log level change");
39+
logFoo.debug("hi foo last");
2540
}
2641

2742
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
## can set config including log levels here
22

33
log.level.org.foo=trace
4-
log.level.io.avaje.config=trace
4+
log.level.io.avaje.config=trace
5+
log.level.io.avaje.simplelogger=debug

0 commit comments

Comments
 (0)