Skip to content

Commit ca7fbc7

Browse files
committed
link logbackMDCAdapter in LoggerContext, fixes LOGBACK-1742
Signed-off-by: Ceki Gulcu <ceki@qos.ch>
1 parent 9e833ec commit ca7fbc7

25 files changed

+311
-127
lines changed

logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/boolex/BlackboxJaninoEventEvaluatorTest.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.io.IOException;
1717

1818
import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
19+
import ch.qos.logback.classic.util.LogbackMDCAdapter;
20+
import org.junit.jupiter.api.BeforeEach;
1921
import org.junit.jupiter.api.Disabled;
2022
import org.junit.jupiter.api.Test;
2123
import org.slf4j.MDC;
@@ -42,6 +44,7 @@
4244
public class BlackboxJaninoEventEvaluatorTest {
4345

4446
LoggerContext loggerContext = new LoggerContext();
47+
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
4548
Logger logger = loggerContext.getLogger(BlackboxJaninoEventEvaluatorTest.class);
4649

4750
Matcher matcherX = new Matcher();
@@ -50,7 +53,9 @@ public class BlackboxJaninoEventEvaluatorTest {
5053

5154
int diff = RandomUtil.getPositiveInt();
5255

53-
public BlackboxJaninoEventEvaluatorTest() {
56+
@BeforeEach
57+
public void setup() {
58+
loggerContext.setMDCAdapter(logbackMDCAdapter);
5459
jee.setContext(loggerContext);
5560

5661
matcherX.setName("x");
@@ -106,14 +111,14 @@ public void testWithMatcher() throws Exception {
106111
public void mdcAsString() throws Exception {
107112
String k = "key" + diff;
108113

109-
MDC.put("key" + diff, "value" + diff);
114+
logbackMDCAdapter.put("key" + diff, "value" + diff);
110115
jee.setExpression("((String) mdc.get(\"" + k + "\")).contains(\"alue\")");
111116
jee.start();
112117
StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);
113118

114119
LoggingEvent event = makeLoggingEvent(null);
115120
assertTrue(jee.evaluate(event));
116-
MDC.remove(k);
121+
logbackMDCAdapter.remove(k);
117122
}
118123

119124
@Disabled

logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/BlackboxJoranConfiguratorTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import ch.qos.logback.classic.blackbox.BlackboxClassicTestConstants;
2121
import ch.qos.logback.classic.joran.JoranConfigurator;
2222
import ch.qos.logback.classic.spi.ILoggingEvent;
23+
import ch.qos.logback.classic.util.LogbackMDCAdapter;
2324
import ch.qos.logback.core.joran.spi.JoranException;
2425
import ch.qos.logback.core.read.ListAppender;
2526
import ch.qos.logback.core.testUtil.RandomUtil;
@@ -34,12 +35,14 @@
3435

3536
public class BlackboxJoranConfiguratorTest {
3637
LoggerContext loggerContext = new LoggerContext();
38+
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
3739
Logger logger = loggerContext.getLogger(this.getClass().getName());
3840
Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
3941
//StatusChecker checker = new StatusChecker(loggerContext);
4042
int diff = RandomUtil.getPositiveInt();
4143

4244
void configure(String file) throws JoranException {
45+
loggerContext.setMDCAdapter(logbackMDCAdapter);
4346
JoranConfigurator jc = new JoranConfigurator();
4447
jc.setContext(loggerContext);
4548
loggerContext.putProperty("diff", "" + diff);

logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/conditional/ConditionalTest.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import ch.qos.logback.classic.joran.JoranConfigurator;
2020
import ch.qos.logback.classic.sift.SiftingAppender;
2121
import ch.qos.logback.classic.spi.ILoggingEvent;
22+
import ch.qos.logback.classic.util.LogbackMDCAdapter;
2223
import ch.qos.logback.core.Appender;
2324
import ch.qos.logback.core.ConsoleAppender;
2425
import ch.qos.logback.core.FileAppender;
@@ -45,29 +46,31 @@
4546

4647
public class ConditionalTest {
4748

48-
LoggerContext context = new LoggerContext();
49-
Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
49+
LoggerContext loggerContext = new LoggerContext();
50+
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
51+
Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
5052

51-
Logger logger = context.getLogger(this.getClass().getName());
53+
Logger logger = loggerContext.getLogger(this.getClass().getName());
5254

53-
StatusUtil checker = new StatusUtil(context);
55+
StatusUtil checker = new StatusUtil(loggerContext);
5456
int diff = RandomUtil.getPositiveInt();
5557
String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";
5658

5759
@BeforeEach
5860
public void setUp() throws UnknownHostException {
59-
context.setName("c" + diff);
60-
context.putProperty("randomOutputDir", randomOutputDir);
61+
loggerContext.setMDCAdapter(logbackMDCAdapter);
62+
loggerContext.setName("c" + diff);
63+
loggerContext.putProperty("randomOutputDir", randomOutputDir);
6164
}
6265

6366
@AfterEach
6467
public void tearDown() {
65-
StatusPrinter.printIfErrorsOccured(context);
68+
StatusPrinter.printIfErrorsOccured(loggerContext);
6669
}
6770

6871
void configure(String file) throws JoranException {
6972
JoranConfigurator jc = new JoranConfigurator();
70-
jc.setContext(context);
73+
jc.setContext(loggerContext);
7174
jc.doConfigure(file);
7275
}
7376

@@ -77,7 +80,7 @@ public void conditionalConsoleApp_IF_THEN_True() throws JoranException, IOExcept
7780
InetAddress localhost = InetAddress.getLocalHost();
7881
System.out.println("In conditionalConsoleApp_IF_THEN_True, canonicalHostName=\""
7982
+ localhost.getCanonicalHostName() + "] and hostNmae=\"" + localhost.getHostName() + "\"");
80-
context.putProperty("aHost", localhost.getHostName());
83+
loggerContext.putProperty("aHost", localhost.getHostName());
8184

8285
String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "conditional/conditionalConsoleApp.xml";
8386
configure(configFileAsStr);
@@ -129,7 +132,7 @@ public void conditionalInclusionWithExistingFile() throws JoranException, IOExce
129132
String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX
130133
+ "conditional/conditionalIncludeExistingFile.xml";
131134
configure(configFileAsStr);
132-
StatusPrinter.print(context);
135+
StatusPrinter.print(loggerContext);
133136

134137
ConsoleAppender<ILoggingEvent> consoleAppender = (ConsoleAppender<ILoggingEvent>) root.getAppender("CON");
135138
assertNotNull(consoleAppender);
@@ -158,7 +161,7 @@ private AppenderTracker<ILoggingEvent> getAppenderTracker() {
158161
@Test
159162
public void nestedWithinIfThen() throws JoranException {
160163
configure(BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "conditional/siftNestedWithinIfThen.xml");
161-
StatusPrinter.print(context);
164+
StatusPrinter.print(loggerContext);
162165
String msg = "nestedWithinIfThen";
163166
logger.debug(msg);
164167
Appender<ILoggingEvent> appender = getAppenderTracker().find("ifThenDefault");

logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/net/SMTPAppender_GreenTest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import ch.qos.logback.classic.blackbox.BlackboxClassicTestConstants;
2424
import ch.qos.logback.classic.net.SMTPAppender;
25+
import ch.qos.logback.classic.util.LogbackMDCAdapter;
2526
import org.dom4j.DocumentException;
2627
import org.dom4j.io.SAXReader;
2728
import org.junit.jupiter.api.AfterEach;
@@ -73,15 +74,16 @@ public class SMTPAppender_GreenTest {
7374

7475
SMTPAppender smtpAppender;
7576
LoggerContext loggerContext = new LoggerContext();
77+
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
7678
Logger logger = loggerContext.getLogger(this.getClass());
7779

7880
static String REQUIRED_USERNAME = "alice";
7981
static String REQUIRED_PASSWORD = "alicepass";
8082

8183
@BeforeEach
8284
public void setUp() throws Exception {
85+
loggerContext.setMDCAdapter(logbackMDCAdapter);
8386
StatusListenerConfigHelper.addOnConsoleListenerInstance(loggerContext, new OnConsoleStatusListener());
84-
MDC.clear();
8587
}
8688

8789
void startSMTPServer(boolean withSSL) {
@@ -238,9 +240,9 @@ public void LOGBACK_352() throws Exception {
238240
smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
239241
smtpAppender.start();
240242
logger.addAppender(smtpAppender);
241-
MDC.put("key", "val");
243+
logbackMDCAdapter.put("key", "val");
242244
logger.debug("LBCLASSIC_104");
243-
MDC.clear();
245+
logbackMDCAdapter.clear();
244246
logger.error("en error", new Exception("test"));
245247

246248
MimeMultipart mp = verifyAndExtractMimeMultipart(subject);

logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
import java.util.concurrent.ConcurrentHashMap;
2525
import java.util.concurrent.ScheduledFuture;
2626

27+
import ch.qos.logback.classic.util.LogbackMDCAdapter;
28+
import ch.qos.logback.core.status.ErrorStatus;
29+
import ch.qos.logback.core.status.InfoStatus;
2730
import org.slf4j.ILoggerFactory;
2831
import org.slf4j.Marker;
2932

@@ -68,6 +71,9 @@ public class LoggerContext extends ContextBase implements ILoggerFactory, LifeCy
6871
private boolean packagingDataEnabled = DEFAULT_PACKAGING_DATA;
6972
SequenceNumberGenerator sequenceNumberGenerator = null; // by default there is no SequenceNumberGenerator
7073

74+
LogbackMDCAdapter mdcAdapter;
75+
76+
7177
private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH;
7278

7379
int resetCount = 0;
@@ -110,6 +116,8 @@ public void setName(String name) {
110116
updateLoggerContextVO();
111117
}
112118

119+
120+
113121
public final Logger getLogger(final Class<?> clazz) {
114122
return getLogger(clazz.getName());
115123
}
@@ -396,4 +404,17 @@ public void setSequenceNumberGenerator(SequenceNumberGenerator sng) {
396404
public SequenceNumberGenerator getSequenceNumberGenerator() {
397405
return sequenceNumberGenerator;
398406
}
407+
408+
public LogbackMDCAdapter getMDCAdapter() {
409+
return mdcAdapter;
410+
}
411+
412+
public void setMDCAdapter(LogbackMDCAdapter anAdapter) {
413+
if(this.mdcAdapter == null) {
414+
this.mdcAdapter = anAdapter;
415+
} else {
416+
StatusManager sm = getStatusManager();
417+
sm.add(new ErrorStatus("mdcAdapter already set", this, new Throwable()));
418+
}
419+
}
399420
}

logback-classic/src/main/java/ch/qos/logback/classic/encoder/JsonEncoder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import ch.qos.logback.classic.spi.IThrowableProxy;
1919
import ch.qos.logback.classic.spi.LoggerContextVO;
2020
import ch.qos.logback.classic.spi.StackTraceElementProxy;
21+
import ch.qos.logback.core.CoreConstants;
2122
import ch.qos.logback.core.encoder.EncoderBase;
2223
import org.slf4j.Marker;
2324
import org.slf4j.event.KeyValuePair;
@@ -34,7 +35,8 @@
3435
import static ch.qos.logback.core.model.ModelConstants.NULL_STR;
3536

3637
/**
37-
*
38+
* http://ndjson.org/
39+
* https://datatracker.ietf.org/doc/html/rfc8259
3840
*/
3941
public class JsonEncoder extends EncoderBase<ILoggingEvent> {
4042
static final boolean DO_NOT_ADD_QUOTE_KEY = false;
@@ -139,6 +141,7 @@ public byte[] encode(ILoggingEvent event) {
139141

140142
appendThrowableProxy(sb, event);
141143
sb.append(CLOSE_OBJ);
144+
sb.append(CoreConstants.JSON_LINE_SEPARATOR);
142145
return sb.toString().getBytes(UTF_8_CHARSET);
143146
}
144147

logback-classic/src/main/java/ch/qos/logback/classic/spi/LogbackServiceProvider.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class LogbackServiceProvider implements SLF4JServiceProvider {
2828

2929
private LoggerContext defaultLoggerContext;
3030
private IMarkerFactory markerFactory;
31-
private MDCAdapter mdcAdapter;
31+
private LogbackMDCAdapter mdcAdapter;
3232
// private final ContextSelectorStaticBinder contextSelectorBinder =
3333
// ContextSelectorStaticBinder.getSingleton();
3434
// private static Object KEY = new Object();
@@ -42,6 +42,8 @@ public void initialize() {
4242
defaultLoggerContext.start();
4343
markerFactory = new BasicMarkerFactory();
4444
mdcAdapter = new LogbackMDCAdapter();
45+
// set the MDCAdapter for the defaultLoggerContext immediately
46+
defaultLoggerContext.setMDCAdapter(mdcAdapter);
4547
}
4648

4749
private void initializeLoggerContext() {

logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.List;
2323
import java.util.Map;
2424

25-
import org.slf4j.MDC;
2625
import org.slf4j.Marker;
2726
import org.slf4j.event.KeyValuePair;
2827
import org.slf4j.helpers.MessageFormatter;
@@ -405,11 +404,11 @@ public String getFormattedMessage() {
405404
public Map<String, String> getMDCPropertyMap() {
406405
// populate mdcPropertyMap if null
407406
if (mdcPropertyMap == null) {
408-
MDCAdapter mdc = MDC.getMDCAdapter();
409-
if (mdc instanceof LogbackMDCAdapter)
410-
mdcPropertyMap = ((LogbackMDCAdapter) mdc).getPropertyMap();
407+
LogbackMDCAdapter mdcAdapter = loggerContext.getMDCAdapter();
408+
if (mdcAdapter instanceof LogbackMDCAdapter)
409+
mdcPropertyMap = ((LogbackMDCAdapter) mdcAdapter).getPropertyMap();
411410
else
412-
mdcPropertyMap = mdc.getCopyOfContextMap();
411+
mdcPropertyMap = mdcAdapter.getCopyOfContextMap();
413412
}
414413
// mdcPropertyMap still null, use emptyMap()
415414
if (mdcPropertyMap == null)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
3+
<!--
4+
~ Logback: the reliable, generic, fast and flexible logging framework.
5+
~ Copyright (C) 1999-2023, QOS.ch. All rights reserved.
6+
~
7+
~ This program and the accompanying materials are dual-licensed under
8+
~ either the terms of the Eclipse Public License v1.0 as published by
9+
~ the Eclipse Foundation
10+
~
11+
~ or (per the licensee's choosing)
12+
~
13+
~ under the terms of the GNU Lesser General Public License version 2.1
14+
~ as published by the Free Software Foundation.
15+
-->
16+
17+
<configuration>
18+
19+
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
20+
<file>target/test-output/json/test-${diff}.json</file>
21+
<encoder class="ch.qos.logback.classic.encoder.JsonEncoder"/>
22+
</appender>
23+
24+
25+
<root>
26+
<level value="DEBUG"/>
27+
<appender-ref ref="FILE"/>
28+
</root>
29+
30+
</configuration>

logback-classic/src/test/java/ch/qos/logback/classic/AsyncAppenderTest.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import ch.qos.logback.classic.net.testObjectBuilders.LoggingEventBuilderInContext;
1717
import ch.qos.logback.classic.spi.ILoggingEvent;
18+
import ch.qos.logback.classic.util.LogbackMDCAdapter;
1819
import ch.qos.logback.core.UnsynchronizedAppenderBase;
1920
import ch.qos.logback.core.read.ListAppender;
2021
import ch.qos.logback.core.status.OnConsoleStatusListener;
@@ -34,22 +35,24 @@
3435
public class AsyncAppenderTest {
3536

3637
String thisClassName = this.getClass().getName();
37-
LoggerContext context = new LoggerContext();
38+
LoggerContext loggerContext = new LoggerContext();
39+
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
3840
AsyncAppender asyncAppender = new AsyncAppender();
3941
ListAppender<ILoggingEvent> listAppender = new ListAppender<ILoggingEvent>();
4042
OnConsoleStatusListener onConsoleStatusListener = new OnConsoleStatusListener();
41-
LoggingEventBuilderInContext builder = new LoggingEventBuilderInContext(context, thisClassName,
43+
LoggingEventBuilderInContext builder = new LoggingEventBuilderInContext(loggerContext, thisClassName,
4244
UnsynchronizedAppenderBase.class.getName());
4345
int diff = RandomUtil.getPositiveInt();
4446

4547
@BeforeEach
4648
public void setUp() {
47-
onConsoleStatusListener.setContext(context);
48-
context.getStatusManager().add(onConsoleStatusListener);
49+
loggerContext.setMDCAdapter(logbackMDCAdapter);
50+
onConsoleStatusListener.setContext(loggerContext);
51+
loggerContext.getStatusManager().add(onConsoleStatusListener);
4952
onConsoleStatusListener.start();
5053

51-
asyncAppender.setContext(context);
52-
listAppender.setContext(context);
54+
asyncAppender.setContext(loggerContext);
55+
listAppender.setContext(loggerContext);
5356
listAppender.setName("list");
5457
listAppender.start();
5558
}
@@ -60,7 +63,7 @@ public void eventWasPreparedForDeferredProcessing() {
6063
asyncAppender.start();
6164

6265
String k = "k" + diff;
63-
MDC.put(k, "v");
66+
logbackMDCAdapter.put(k, "v");
6467
asyncAppender.doAppend(builder.build(diff));
6568
MDC.clear();
6669

0 commit comments

Comments
 (0)