Skip to content

Commit

Permalink
link logbackMDCAdapter in LoggerContext, fixes LOGBACK-1742
Browse files Browse the repository at this point in the history
Signed-off-by: Ceki Gulcu <ceki@qos.ch>
  • Loading branch information
ceki committed May 21, 2023
1 parent 9e833ec commit ca7fbc7
Show file tree
Hide file tree
Showing 25 changed files with 311 additions and 127 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import java.io.IOException;

import ch.qos.logback.classic.boolex.JaninoEventEvaluator;
import ch.qos.logback.classic.util.LogbackMDCAdapter;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.slf4j.MDC;
Expand All @@ -42,6 +44,7 @@
public class BlackboxJaninoEventEvaluatorTest {

LoggerContext loggerContext = new LoggerContext();
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
Logger logger = loggerContext.getLogger(BlackboxJaninoEventEvaluatorTest.class);

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

int diff = RandomUtil.getPositiveInt();

public BlackboxJaninoEventEvaluatorTest() {
@BeforeEach
public void setup() {
loggerContext.setMDCAdapter(logbackMDCAdapter);
jee.setContext(loggerContext);

matcherX.setName("x");
Expand Down Expand Up @@ -106,14 +111,14 @@ public void testWithMatcher() throws Exception {
public void mdcAsString() throws Exception {
String k = "key" + diff;

MDC.put("key" + diff, "value" + diff);
logbackMDCAdapter.put("key" + diff, "value" + diff);
jee.setExpression("((String) mdc.get(\"" + k + "\")).contains(\"alue\")");
jee.start();
StatusPrinter.printInCaseOfErrorsOrWarnings(loggerContext);

LoggingEvent event = makeLoggingEvent(null);
assertTrue(jee.evaluate(event));
MDC.remove(k);
logbackMDCAdapter.remove(k);
}

@Disabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import ch.qos.logback.classic.blackbox.BlackboxClassicTestConstants;
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.util.LogbackMDCAdapter;
import ch.qos.logback.core.joran.spi.JoranException;
import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.testUtil.RandomUtil;
Expand All @@ -34,12 +35,14 @@

public class BlackboxJoranConfiguratorTest {
LoggerContext loggerContext = new LoggerContext();
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
Logger logger = loggerContext.getLogger(this.getClass().getName());
Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);
//StatusChecker checker = new StatusChecker(loggerContext);
int diff = RandomUtil.getPositiveInt();

void configure(String file) throws JoranException {
loggerContext.setMDCAdapter(logbackMDCAdapter);
JoranConfigurator jc = new JoranConfigurator();
jc.setContext(loggerContext);
loggerContext.putProperty("diff", "" + diff);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import ch.qos.logback.classic.joran.JoranConfigurator;
import ch.qos.logback.classic.sift.SiftingAppender;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.util.LogbackMDCAdapter;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.ConsoleAppender;
import ch.qos.logback.core.FileAppender;
Expand All @@ -45,29 +46,31 @@

public class ConditionalTest {

LoggerContext context = new LoggerContext();
Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME);
LoggerContext loggerContext = new LoggerContext();
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME);

Logger logger = context.getLogger(this.getClass().getName());
Logger logger = loggerContext.getLogger(this.getClass().getName());

StatusUtil checker = new StatusUtil(context);
StatusUtil checker = new StatusUtil(loggerContext);
int diff = RandomUtil.getPositiveInt();
String randomOutputDir = CoreTestConstants.OUTPUT_DIR_PREFIX + diff + "/";

@BeforeEach
public void setUp() throws UnknownHostException {
context.setName("c" + diff);
context.putProperty("randomOutputDir", randomOutputDir);
loggerContext.setMDCAdapter(logbackMDCAdapter);
loggerContext.setName("c" + diff);
loggerContext.putProperty("randomOutputDir", randomOutputDir);
}

@AfterEach
public void tearDown() {
StatusPrinter.printIfErrorsOccured(context);
StatusPrinter.printIfErrorsOccured(loggerContext);
}

void configure(String file) throws JoranException {
JoranConfigurator jc = new JoranConfigurator();
jc.setContext(context);
jc.setContext(loggerContext);
jc.doConfigure(file);
}

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

String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "conditional/conditionalConsoleApp.xml";
configure(configFileAsStr);
Expand Down Expand Up @@ -129,7 +132,7 @@ public void conditionalInclusionWithExistingFile() throws JoranException, IOExce
String configFileAsStr = BlackboxClassicTestConstants.JORAN_INPUT_PREFIX
+ "conditional/conditionalIncludeExistingFile.xml";
configure(configFileAsStr);
StatusPrinter.print(context);
StatusPrinter.print(loggerContext);

ConsoleAppender<ILoggingEvent> consoleAppender = (ConsoleAppender<ILoggingEvent>) root.getAppender("CON");
assertNotNull(consoleAppender);
Expand Down Expand Up @@ -158,7 +161,7 @@ private AppenderTracker<ILoggingEvent> getAppenderTracker() {
@Test
public void nestedWithinIfThen() throws JoranException {
configure(BlackboxClassicTestConstants.JORAN_INPUT_PREFIX + "conditional/siftNestedWithinIfThen.xml");
StatusPrinter.print(context);
StatusPrinter.print(loggerContext);
String msg = "nestedWithinIfThen";
logger.debug(msg);
Appender<ILoggingEvent> appender = getAppenderTracker().find("ifThenDefault");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import ch.qos.logback.classic.blackbox.BlackboxClassicTestConstants;
import ch.qos.logback.classic.net.SMTPAppender;
import ch.qos.logback.classic.util.LogbackMDCAdapter;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.AfterEach;
Expand Down Expand Up @@ -73,15 +74,16 @@ public class SMTPAppender_GreenTest {

SMTPAppender smtpAppender;
LoggerContext loggerContext = new LoggerContext();
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
Logger logger = loggerContext.getLogger(this.getClass());

static String REQUIRED_USERNAME = "alice";
static String REQUIRED_PASSWORD = "alicepass";

@BeforeEach
public void setUp() throws Exception {
loggerContext.setMDCAdapter(logbackMDCAdapter);
StatusListenerConfigHelper.addOnConsoleListenerInstance(loggerContext, new OnConsoleStatusListener());
MDC.clear();
}

void startSMTPServer(boolean withSSL) {
Expand Down Expand Up @@ -238,9 +240,9 @@ public void LOGBACK_352() throws Exception {
smtpAppender.setLayout(buildPatternLayout(DEFAULT_PATTERN));
smtpAppender.start();
logger.addAppender(smtpAppender);
MDC.put("key", "val");
logbackMDCAdapter.put("key", "val");
logger.debug("LBCLASSIC_104");
MDC.clear();
logbackMDCAdapter.clear();
logger.error("en error", new Exception("test"));

MimeMultipart mp = verifyAndExtractMimeMultipart(subject);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;

import ch.qos.logback.classic.util.LogbackMDCAdapter;
import ch.qos.logback.core.status.ErrorStatus;
import ch.qos.logback.core.status.InfoStatus;
import org.slf4j.ILoggerFactory;
import org.slf4j.Marker;

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

LogbackMDCAdapter mdcAdapter;


private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH;

int resetCount = 0;
Expand Down Expand Up @@ -110,6 +116,8 @@ public void setName(String name) {
updateLoggerContextVO();
}



public final Logger getLogger(final Class<?> clazz) {
return getLogger(clazz.getName());
}
Expand Down Expand Up @@ -396,4 +404,17 @@ public void setSequenceNumberGenerator(SequenceNumberGenerator sng) {
public SequenceNumberGenerator getSequenceNumberGenerator() {
return sequenceNumberGenerator;
}

public LogbackMDCAdapter getMDCAdapter() {
return mdcAdapter;
}

public void setMDCAdapter(LogbackMDCAdapter anAdapter) {
if(this.mdcAdapter == null) {
this.mdcAdapter = anAdapter;
} else {
StatusManager sm = getStatusManager();
sm.add(new ErrorStatus("mdcAdapter already set", this, new Throwable()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.LoggerContextVO;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.encoder.EncoderBase;
import org.slf4j.Marker;
import org.slf4j.event.KeyValuePair;
Expand All @@ -34,7 +35,8 @@
import static ch.qos.logback.core.model.ModelConstants.NULL_STR;

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

appendThrowableProxy(sb, event);
sb.append(CLOSE_OBJ);
sb.append(CoreConstants.JSON_LINE_SEPARATOR);
return sb.toString().getBytes(UTF_8_CHARSET);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class LogbackServiceProvider implements SLF4JServiceProvider {

private LoggerContext defaultLoggerContext;
private IMarkerFactory markerFactory;
private MDCAdapter mdcAdapter;
private LogbackMDCAdapter mdcAdapter;
// private final ContextSelectorStaticBinder contextSelectorBinder =
// ContextSelectorStaticBinder.getSingleton();
// private static Object KEY = new Object();
Expand All @@ -42,6 +42,8 @@ public void initialize() {
defaultLoggerContext.start();
markerFactory = new BasicMarkerFactory();
mdcAdapter = new LogbackMDCAdapter();
// set the MDCAdapter for the defaultLoggerContext immediately
defaultLoggerContext.setMDCAdapter(mdcAdapter);
}

private void initializeLoggerContext() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import java.util.List;
import java.util.Map;

import org.slf4j.MDC;
import org.slf4j.Marker;
import org.slf4j.event.KeyValuePair;
import org.slf4j.helpers.MessageFormatter;
Expand Down Expand Up @@ -405,11 +404,11 @@ public String getFormattedMessage() {
public Map<String, String> getMDCPropertyMap() {
// populate mdcPropertyMap if null
if (mdcPropertyMap == null) {
MDCAdapter mdc = MDC.getMDCAdapter();
if (mdc instanceof LogbackMDCAdapter)
mdcPropertyMap = ((LogbackMDCAdapter) mdc).getPropertyMap();
LogbackMDCAdapter mdcAdapter = loggerContext.getMDCAdapter();
if (mdcAdapter instanceof LogbackMDCAdapter)
mdcPropertyMap = ((LogbackMDCAdapter) mdcAdapter).getPropertyMap();
else
mdcPropertyMap = mdc.getCopyOfContextMap();
mdcPropertyMap = mdcAdapter.getCopyOfContextMap();
}
// mdcPropertyMap still null, use emptyMap()
if (mdcPropertyMap == null)
Expand Down
30 changes: 30 additions & 0 deletions logback-classic/src/test/input/joran/json/jsonEncoder.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8" ?>

<!--
~ Logback: the reliable, generic, fast and flexible logging framework.
~ Copyright (C) 1999-2023, QOS.ch. All rights reserved.
~
~ This program and the accompanying materials are dual-licensed under
~ either the terms of the Eclipse Public License v1.0 as published by
~ the Eclipse Foundation
~
~ or (per the licensee's choosing)
~
~ under the terms of the GNU Lesser General Public License version 2.1
~ as published by the Free Software Foundation.
-->

<configuration>

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>target/test-output/json/test-${diff}.json</file>
<encoder class="ch.qos.logback.classic.encoder.JsonEncoder"/>
</appender>


<root>
<level value="DEBUG"/>
<appender-ref ref="FILE"/>
</root>

</configuration>
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

import ch.qos.logback.classic.net.testObjectBuilders.LoggingEventBuilderInContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.util.LogbackMDCAdapter;
import ch.qos.logback.core.UnsynchronizedAppenderBase;
import ch.qos.logback.core.read.ListAppender;
import ch.qos.logback.core.status.OnConsoleStatusListener;
Expand All @@ -34,22 +35,24 @@
public class AsyncAppenderTest {

String thisClassName = this.getClass().getName();
LoggerContext context = new LoggerContext();
LoggerContext loggerContext = new LoggerContext();
LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter();
AsyncAppender asyncAppender = new AsyncAppender();
ListAppender<ILoggingEvent> listAppender = new ListAppender<ILoggingEvent>();
OnConsoleStatusListener onConsoleStatusListener = new OnConsoleStatusListener();
LoggingEventBuilderInContext builder = new LoggingEventBuilderInContext(context, thisClassName,
LoggingEventBuilderInContext builder = new LoggingEventBuilderInContext(loggerContext, thisClassName,
UnsynchronizedAppenderBase.class.getName());
int diff = RandomUtil.getPositiveInt();

@BeforeEach
public void setUp() {
onConsoleStatusListener.setContext(context);
context.getStatusManager().add(onConsoleStatusListener);
loggerContext.setMDCAdapter(logbackMDCAdapter);
onConsoleStatusListener.setContext(loggerContext);
loggerContext.getStatusManager().add(onConsoleStatusListener);
onConsoleStatusListener.start();

asyncAppender.setContext(context);
listAppender.setContext(context);
asyncAppender.setContext(loggerContext);
listAppender.setContext(loggerContext);
listAppender.setName("list");
listAppender.start();
}
Expand All @@ -60,7 +63,7 @@ public void eventWasPreparedForDeferredProcessing() {
asyncAppender.start();

String k = "k" + diff;
MDC.put(k, "v");
logbackMDCAdapter.put(k, "v");
asyncAppender.doAppend(builder.build(diff));
MDC.clear();

Expand Down
Loading

0 comments on commit ca7fbc7

Please sign in to comment.