Skip to content

Commit 03f21cc

Browse files
Dynamic prefix filtering for Logback
Provides a new TurboFilter for dynamic log level support with support for class names. The DynamicLevelPrefixLoggerTurboFilter will check the Logger name against a list of prefixes and only change the log level on matching names.
1 parent 0b2faec commit 03f21cc

File tree

3 files changed

+120
-0
lines changed

3 files changed

+120
-0
lines changed

cf-java-logging-support-core/src/main/java/com/sap/hcp/cf/logging/common/helper/DynamicLogLevelHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ public class DynamicLogLevelHelper {
77
* from mdc
88
*/
99
public static final String MDC_DYNAMIC_LOG_LEVEL_KEY = "dynamic_log_level";
10+
public static final String MDC_DYNAMIC_LOG_LEVEL_PREFIXES = "dynamic_log_level_prefixes";
1011

1112
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.sap.hcp.cf.logback.filter;
2+
3+
import org.apache.commons.lang3.StringUtils;
4+
import org.slf4j.MDC;
5+
import org.slf4j.Marker;
6+
7+
import com.sap.hcp.cf.logging.common.helper.DynamicLogLevelHelper;
8+
9+
import ch.qos.logback.classic.Level;
10+
import ch.qos.logback.classic.Logger;
11+
import ch.qos.logback.classic.turbo.TurboFilter;
12+
import ch.qos.logback.core.spi.FilterReply;
13+
14+
public class DynamicLevelPrefixLoggerTurboFilter extends TurboFilter {
15+
16+
@Override
17+
public FilterReply decide(final Marker marker, final Logger logger, final Level level, final String format,
18+
final Object[] params, final Throwable t) {
19+
final String logLevel = MDC.get(DynamicLogLevelHelper.MDC_DYNAMIC_LOG_LEVEL_KEY);
20+
if (logLevel != null && level.isGreaterOrEqual(Level.toLevel(logLevel)) && checkPackages(logger)) {
21+
return FilterReply.ACCEPT;
22+
}
23+
return FilterReply.NEUTRAL;
24+
}
25+
26+
private boolean checkPackages(final Logger logger) {
27+
final String logLevelPackages = MDC.get(DynamicLogLevelHelper.MDC_DYNAMIC_LOG_LEVEL_PREFIXES);
28+
if (StringUtils.isNotBlank(logLevelPackages)) {
29+
for (String current : logLevelPackages.split(",")) {
30+
if (logger.getName().startsWith(current)) {
31+
return true;
32+
}
33+
}
34+
}
35+
return false;
36+
}
37+
38+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.sap.hcp.cf.logback.filter;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.Matchers.hasSize;
5+
import static org.hamcrest.Matchers.is;
6+
import static org.junit.Assert.assertThat;
7+
8+
import org.junit.Before;
9+
import org.junit.Test;
10+
import org.slf4j.MDC;
11+
12+
import com.sap.hcp.cf.logging.common.helper.DynamicLogLevelHelper;
13+
14+
import ch.qos.logback.classic.Level;
15+
import ch.qos.logback.classic.Logger;
16+
import ch.qos.logback.classic.LoggerContext;
17+
import ch.qos.logback.classic.spi.ILoggingEvent;
18+
import ch.qos.logback.classic.turbo.TurboFilter;
19+
import ch.qos.logback.core.read.ListAppender;
20+
import ch.qos.logback.core.spi.FilterReply;
21+
22+
public class DynamicLevelPrefixLoggerTurboFilterTest {
23+
24+
private static final String KNOWN_PREFIX = "known.prefix";
25+
private static final String UNKNOWN_PREFIX = "unknown.prefix";
26+
27+
private LoggerContext loggerContext = new LoggerContext();
28+
private TurboFilter filter = new DynamicLevelPrefixLoggerTurboFilter();
29+
30+
@Before
31+
public void setUp() {
32+
MDC.clear();
33+
MDC.put(DynamicLogLevelHelper.MDC_DYNAMIC_LOG_LEVEL_KEY, "DEBUG");
34+
MDC.put(DynamicLogLevelHelper.MDC_DYNAMIC_LOG_LEVEL_PREFIXES, KNOWN_PREFIX);
35+
loggerContext.addTurboFilter(filter);
36+
}
37+
38+
@Test
39+
public void acceptsOnKnownPackage() throws Exception {
40+
Logger logger = loggerContext.getLogger(KNOWN_PREFIX + "acceptsOnKnownPackage");
41+
assertThat(filter.decide(null, logger, Level.INFO, null, null, null), is(FilterReply.ACCEPT));
42+
}
43+
44+
@Test
45+
public void neutralOnUnknownPackage() throws Exception {
46+
Logger logger = loggerContext.getLogger(UNKNOWN_PREFIX + "neutralOnUnknownPackage");
47+
assertThat(filter.decide(null, logger, Level.INFO, null, null, null), is(FilterReply.NEUTRAL));
48+
}
49+
50+
@Test
51+
public void neutralOnLowerLevel() throws Exception {
52+
Logger logger = loggerContext.getLogger(KNOWN_PREFIX + "neutralOnUnknownPackage");
53+
assertThat(filter.decide(null, logger, Level.TRACE, null, null, null), is(FilterReply.NEUTRAL));
54+
}
55+
56+
@Test
57+
public void neutralOnUnconfiguredLevelKey() throws Exception {
58+
MDC.remove(DynamicLogLevelHelper.MDC_DYNAMIC_LOG_LEVEL_KEY);
59+
Logger logger = loggerContext.getLogger(KNOWN_PREFIX + "neutralOnUnknownPackage");
60+
assertThat(filter.decide(null, logger, Level.INFO, null, null, null), is(FilterReply.NEUTRAL));
61+
}
62+
63+
@Test
64+
public void neutralOnUnconfiguredPrefix() throws Exception {
65+
MDC.remove(DynamicLogLevelHelper.MDC_DYNAMIC_LOG_LEVEL_PREFIXES);
66+
Logger logger = loggerContext.getLogger(KNOWN_PREFIX + "neutralOnUnknownPackage");
67+
assertThat(filter.decide(null, logger, Level.INFO, null, null, null), is(FilterReply.NEUTRAL));
68+
}
69+
70+
@Test
71+
public void integratesIntoConfiguration() throws Exception {
72+
Logger logger = loggerContext.getLogger(KNOWN_PREFIX + "integratesIntoConfiguration");
73+
ListAppender<ILoggingEvent> appender = new ListAppender<ILoggingEvent>();
74+
appender.start();
75+
logger.addAppender(appender);
76+
logger.info("test-integration-message");
77+
assertThat(appender.list, hasSize(1));
78+
assertThat(appender.list.get(0).getMessage(), is(equalTo("test-integration-message")));
79+
appender.stop();
80+
}
81+
}

0 commit comments

Comments
 (0)