From ca7fbc7f4c1b1883092037ee4a662034586df07a Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Sun, 21 May 2023 23:31:50 +0200 Subject: [PATCH] link logbackMDCAdapter in LoggerContext, fixes LOGBACK-1742 Signed-off-by: Ceki Gulcu --- .../BlackboxJaninoEventEvaluatorTest.java | 11 ++- .../joran/BlackboxJoranConfiguratorTest.java | 3 + .../joran/conditional/ConditionalTest.java | 25 ++++--- .../blackbox/net/SMTPAppender_GreenTest.java | 8 ++- .../ch/qos/logback/classic/LoggerContext.java | 21 ++++++ .../logback/classic/encoder/JsonEncoder.java | 5 +- .../classic/spi/LogbackServiceProvider.java | 4 +- .../qos/logback/classic/spi/LoggingEvent.java | 9 ++- .../src/test/input/joran/json/jsonEncoder.xml | 30 +++++++++ .../logback/classic/AsyncAppenderTest.java | 17 +++-- .../logback/classic/PatternLayoutTest.java | 60 ++++++++++------- .../classic/encoder/JsonEncoderTest.java | 67 ++++++++++++++++++- .../classic/joran/JoranConfiguratorTest.java | 3 + .../classic/net/DilutedSMTPAppenderTest.java | 10 ++- .../net/SocketAppenderMessageLossTest.java | 6 ++ .../classic/net/SocketReceiverTest.java | 4 ++ .../classic/net/SyslogAppenderTest.java | 4 ++ .../ServerSocketReceiverFunctionalTest.java | 4 +- .../classic/pattern/ConverterTest.java | 26 +++---- .../classic/pattern/MDCConverterTest.java | 19 +++--- .../TimeBasedRollingWithConfigFileTest.java | 43 ++++++------ .../sift/MDCBasedDiscriminatorTest.java | 12 ++-- .../classic/sift/SiftingAppenderTest.java | 37 +++++----- .../spi/LoggingEventSerializationTest.java | 9 ++- .../ch/qos/logback/core/CoreConstants.java | 1 + 25 files changed, 311 insertions(+), 127 deletions(-) create mode 100644 logback-classic/src/test/input/joran/json/jsonEncoder.xml diff --git a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/boolex/BlackboxJaninoEventEvaluatorTest.java b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/boolex/BlackboxJaninoEventEvaluatorTest.java index c3396ccaf5..bf31305a31 100644 --- a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/boolex/BlackboxJaninoEventEvaluatorTest.java +++ b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/boolex/BlackboxJaninoEventEvaluatorTest.java @@ -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; @@ -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(); @@ -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"); @@ -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 diff --git a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/BlackboxJoranConfiguratorTest.java b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/BlackboxJoranConfiguratorTest.java index 4dd4a8d69f..80943c4918 100644 --- a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/BlackboxJoranConfiguratorTest.java +++ b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/BlackboxJoranConfiguratorTest.java @@ -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; @@ -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); diff --git a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/conditional/ConditionalTest.java b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/conditional/ConditionalTest.java index 0c85549959..74dbbb8812 100644 --- a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/conditional/ConditionalTest.java +++ b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/joran/conditional/ConditionalTest.java @@ -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; @@ -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); } @@ -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); @@ -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 consoleAppender = (ConsoleAppender) root.getAppender("CON"); assertNotNull(consoleAppender); @@ -158,7 +161,7 @@ private AppenderTracker 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 appender = getAppenderTracker().find("ifThenDefault"); diff --git a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/net/SMTPAppender_GreenTest.java b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/net/SMTPAppender_GreenTest.java index b373239d77..d514f0dc9a 100644 --- a/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/net/SMTPAppender_GreenTest.java +++ b/logback-classic-blackbox/src/test/java/ch/qos/logback/classic/blackbox/net/SMTPAppender_GreenTest.java @@ -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; @@ -73,6 +74,7 @@ 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"; @@ -80,8 +82,8 @@ public class SMTPAppender_GreenTest { @BeforeEach public void setUp() throws Exception { + loggerContext.setMDCAdapter(logbackMDCAdapter); StatusListenerConfigHelper.addOnConsoleListenerInstance(loggerContext, new OnConsoleStatusListener()); - MDC.clear(); } void startSMTPServer(boolean withSSL) { @@ -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); diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java b/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java index f5e702bbee..e86758a91a 100755 --- a/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java @@ -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; @@ -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; @@ -110,6 +116,8 @@ public void setName(String name) { updateLoggerContextVO(); } + + public final Logger getLogger(final Class clazz) { return getLogger(clazz.getName()); } @@ -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())); + } + } } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/JsonEncoder.java b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/JsonEncoder.java index 9be688573a..d131c96a83 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/encoder/JsonEncoder.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/encoder/JsonEncoder.java @@ -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; @@ -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 { static final boolean DO_NOT_ADD_QUOTE_KEY = false; @@ -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); } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LogbackServiceProvider.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LogbackServiceProvider.java index a8e5acb596..ecf96954b1 100755 --- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LogbackServiceProvider.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LogbackServiceProvider.java @@ -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(); @@ -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() { diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java index 7d772b4258..ba726bd63c 100755 --- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java @@ -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; @@ -405,11 +404,11 @@ public String getFormattedMessage() { public Map 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) diff --git a/logback-classic/src/test/input/joran/json/jsonEncoder.xml b/logback-classic/src/test/input/joran/json/jsonEncoder.xml new file mode 100644 index 0000000000..ffef3d87d9 --- /dev/null +++ b/logback-classic/src/test/input/joran/json/jsonEncoder.xml @@ -0,0 +1,30 @@ + + + + + + + + target/test-output/json/test-${diff}.json + + + + + + + + + + diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/AsyncAppenderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/AsyncAppenderTest.java index b6cebbf841..da2b036c8b 100755 --- a/logback-classic/src/test/java/ch/qos/logback/classic/AsyncAppenderTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/AsyncAppenderTest.java @@ -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; @@ -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 listAppender = new ListAppender(); 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(); } @@ -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(); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java index caedbea94e..00238c61e2 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/PatternLayoutTest.java @@ -19,11 +19,13 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.classic.pattern.SampleConverter; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import ch.qos.logback.core.Context; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.pattern.PatternLayoutBase; import ch.qos.logback.core.pattern.parser.test.AbstractPatternLayoutBaseTest; import ch.qos.logback.core.spi.ScanException; +import ch.qos.logback.core.testUtil.RandomUtil; import ch.qos.logback.core.testUtil.StringListAppender; import ch.qos.logback.core.util.OptionHelper; import org.junit.jupiter.api.BeforeEach; @@ -41,23 +43,25 @@ public class PatternLayoutTest extends AbstractPatternLayoutBaseTest { private PatternLayout pl = new PatternLayout(); - private LoggerContext lc = new LoggerContext(); - Logger logger = lc.getLogger(ConverterTest.class); - Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); + private LoggerContext loggerContext = new LoggerContext(); + + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + Logger logger = loggerContext.getLogger(ConverterTest.class); + Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); + + int diff = RandomUtil.getPositiveInt(); String aMessage = "Some message"; - LoggingEvent le; + Exception ex = new Exception("Bogus exception"); + - public PatternLayoutTest() { - super(); - Exception ex = new Exception("Bogus exception"); - le = makeLoggingEvent(aMessage, ex); - } @BeforeEach public void setUp() { - pl.setContext(lc); + loggerContext.setMDCAdapter(logbackMDCAdapter); + pl.setContext(loggerContext); + //le = makeLoggingEvent(aMessage, ex); } /** @@ -100,7 +104,7 @@ public void testOK() { public void testNoExeptionHandler() { pl.setPattern("%m%n"); pl.start(); - String val = pl.doLayout(le); + String val = pl.doLayout(makeLoggingEvent(aMessage, ex)); assertTrue(val.contains("java.lang.Exception: Bogus exception")); } @@ -118,7 +122,7 @@ public void testCompositePattern() { public void contextProperty() { pl.setPattern("%property{a}"); pl.start(); - lc.putProperty("a", "b"); + loggerContext.putProperty("a", "b"); String val = pl.doLayout(getEventObject()); assertEquals("b", val); @@ -128,7 +132,7 @@ public void contextProperty() { public void testNopExeptionHandler() { pl.setPattern("%nopex %m%n"); pl.start(); - String val = pl.doLayout(le); + String val = pl.doLayout(makeLoggingEvent(aMessage, ex)); assertTrue(!val.contains("java.lang.Exception: Bogus exception")); } @@ -136,7 +140,7 @@ public void testNopExeptionHandler() { public void testWithParenthesis() { pl.setPattern("\\(%msg:%msg\\) %msg"); pl.start(); - le = makeLoggingEvent(aMessage, null); + LoggingEvent le = makeLoggingEvent(aMessage, null); String val = pl.doLayout(le); assertEquals("(Some message:Some message) Some message", val); } @@ -156,22 +160,25 @@ public void testWithLettersComingFromLog4j() { @Test public void mdcWithDefaultValue() throws ScanException { - String pattern = "%msg %mdc{foo} %mdc{bar:-[null]}"; - pl.setPattern(OptionHelper.substVars(pattern, lc)); + String pattern = "%msg %mdc{foo1} %mdc{bar:-[null]}"; + pl.setPattern(OptionHelper.substVars(pattern, loggerContext)); pl.start(); - MDC.put("foo", "foo"); + + String key = "foo1"; + + logbackMDCAdapter.put(key, key); try { String val = pl.doLayout(getEventObject()); - assertEquals("Some message foo [null]", val); + assertEquals("Some message foo1 [null]", val); } finally { - MDC.remove("foo"); + logbackMDCAdapter.remove(key); } } @Test public void contextNameTest() { pl.setPattern("%contextName"); - lc.setName("aValue"); + loggerContext.setName("aValue"); pl.start(); String val = pl.doLayout(getEventObject()); assertEquals("aValue", val); @@ -180,7 +187,7 @@ public void contextNameTest() { @Test public void cnTest() { pl.setPattern("%cn"); - lc.setName("aValue"); + loggerContext.setName("aValue"); pl.start(); String val = pl.doLayout(getEventObject()); assertEquals("aValue", val); @@ -196,6 +203,7 @@ public void micros() { void verifyMicros(int nanos, String expected) { Instant instant = Instant.parse("2011-12-03T10:15:30Z"); instant = instant.plusNanos(nanos); + LoggingEvent le = makeLoggingEvent(aMessage, null); le.setInstant(instant); pl.setPattern("%date{yyyy-MM-dd HH:mm:ss.SSS, UTC} %micros %message%nopex"); @@ -207,12 +215,12 @@ void verifyMicros(int nanos, String expected) { @Override public Context getContext() { - return lc; + return loggerContext; } void configure(String file) throws JoranException { JoranConfigurator jc = new JoranConfigurator(); - jc.setContext(lc); + jc.setContext(loggerContext); jc.doConfigure(file); } @@ -239,7 +247,7 @@ public void smokeReplace() { @Test public void replaceNewline() throws ScanException { String pattern = "%replace(A\nB){'\n', '\n\t'}"; - String substPattern = OptionHelper.substVars(pattern, null, lc); + String substPattern = OptionHelper.substVars(pattern, null, loggerContext); assertEquals(pattern, substPattern); pl.setPattern(substPattern); pl.start(); @@ -263,7 +271,7 @@ public void replaceWithJoran() throws JoranException { @Test public void replaceWithJoran_NEWLINE() throws JoranException { - lc.putProperty("TAB", "\t"); + loggerContext.putProperty("TAB", "\t"); configure(ClassicTestConstants.JORAN_INPUT_PREFIX + "pattern/replaceNewline.xml"); //StatusPrinter.print(lc); root.getAppender("LIST"); @@ -292,7 +300,7 @@ public void prefixConverterWithMDC() { String pattern = "%prefix(%level %logger %X{" + mdcKey + "}) %message"; pl.setPattern(pattern); pl.start(); - MDC.put(mdcKey, mdcVal); + logbackMDCAdapter.put(mdcKey, mdcVal); try { String val = pl.doLayout(makeLoggingEvent("hello", null)); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/encoder/JsonEncoderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/encoder/JsonEncoderTest.java index 607ec75739..edb9b78145 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/encoder/JsonEncoderTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/encoder/JsonEncoderTest.java @@ -14,14 +14,21 @@ package ch.qos.logback.classic.encoder; +import ch.qos.logback.classic.ClassicTestConstants; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.classic.jsonTest.JsonLoggingEvent; import ch.qos.logback.classic.jsonTest.JsonStringToLoggingEventMapper; import ch.qos.logback.classic.jsonTest.ThrowableProxyComparator; +import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; +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; +import ch.qos.logback.core.util.StatusPrinter; import com.fasterxml.jackson.core.JsonProcessingException; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -30,7 +37,10 @@ import org.slf4j.event.KeyValuePair; import org.slf4j.helpers.BasicMarkerFactory; +import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -40,6 +50,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; + +// When running from an IDE, add the following on the command line +// +// --add-opens ch.qos.logback.classic/ch.qos.logback.classic.jsonTest=ALL-UNNAMED +// class JsonEncoderTest { int diff = RandomUtil.getPositiveInt(); @@ -55,14 +70,21 @@ class JsonEncoderTest { Marker markerB = markerFactory.getMarker("B"); + ListAppender listAppender = new ListAppender(); JsonStringToLoggingEventMapper stringToLoggingEventMapper = new JsonStringToLoggingEventMapper(markerFactory); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + @BeforeEach void setUp() { loggerContext.setName("test_" + diff); + loggerContext.setMDCAdapter(logbackMDCAdapter); jsonEncoder.setContext(loggerContext); jsonEncoder.start(); + + listAppender.setContext(loggerContext); + listAppender.start(); } @AfterEach @@ -85,7 +107,7 @@ void smoke() throws JsonProcessingException { @Test void contextWithProperties() throws JsonProcessingException { loggerContext.putProperty("k", "v"); - loggerContext.putProperty("k"+diff, "v"+diff); + loggerContext.putProperty("k" + diff, "v" + diff); LoggingEvent event = new LoggingEvent("x", logger, Level.WARN, "hello", null, null); @@ -242,4 +264,47 @@ void withThrowable() throws JsonProcessingException { JsonLoggingEvent resultEvent = stringToLoggingEventMapper.mapStringToLoggingEvent(resultString); compareEvents(event, resultEvent); } + + void configure(String file) throws JoranException { + JoranConfigurator jc = new JoranConfigurator(); + jc.setContext(loggerContext); + loggerContext.putProperty("diff", "" + diff); + jc.doConfigure(file); + + } + + @Test + void withJoran() throws JoranException, IOException { + String configFilePathStr = ClassicTestConstants.JORAN_INPUT_PREFIX + "json/jsonEncoder.xml"; + + + + configure(configFilePathStr); + Logger logger = loggerContext.getLogger(this.getClass().getName()); + logger.addAppender(listAppender); + + + logger.debug("hello"); + logbackMDCAdapter.put("a1", "v1"+diff); + logger.atInfo().addKeyValue("ik"+diff, "iv"+diff).addKeyValue("a", "b").log("bla bla \"x\" foobar"); + logbackMDCAdapter.put("a2", "v2"+diff); + logger.atWarn().addMarker(markerA).setMessage("some warning message").log(); + logbackMDCAdapter.remove("a2"); + logger.atError().addKeyValue("ek"+diff, "v"+diff).setCause(new RuntimeException("an error")).log("some error occurred"); + + StatusPrinter.print(loggerContext); + + Path configFilePath = Path.of(ClassicTestConstants.OUTPUT_DIR_PREFIX+"json/test-" + diff + ".json"); + List lines = Files.readAllLines(configFilePath); + int count = 4; + assertEquals(count, lines.size()); + + for(int i = 0; i < count; i++) { + System.out.println("i = "+ i); + LoggingEvent withnessEvent = (LoggingEvent) listAppender.list.get(i); + JsonLoggingEvent resultEvent = stringToLoggingEventMapper.mapStringToLoggingEvent(lines.get(i)); + compareEvents(withnessEvent, resultEvent); + } + + } } \ No newline at end of file diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java index 60bfc9ef49..f25eddb495 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/joran/JoranConfiguratorTest.java @@ -717,6 +717,9 @@ public void dateConverterWithLocale() throws JoranException { + + + // reproduction requires placing a binary properties file. Probably not worth the effort. // @Test // public void ossFuzz_47249() throws JoranException { diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java index 5630bb4fb8..01b737def0 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/net/DilutedSMTPAppenderTest.java @@ -13,6 +13,8 @@ */ package ch.qos.logback.classic.net; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -30,14 +32,17 @@ import static org.junit.jupiter.api.Assertions.assertTrue; public class DilutedSMTPAppenderTest { - + LoggerContext lc = new LoggerContext(); + Logger logger = lc.getLogger(this.getClass()); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); SMTPAppender appender; CyclicBufferTracker cbTracker; CyclicBuffer cb; @BeforeEach public void setUp() throws Exception { - LoggerContext lc = new LoggerContext(); + + lc.setMDCAdapter(logbackMDCAdapter); appender = new SMTPAppender(); appender.setContext(lc); appender.setName("smtp"); @@ -81,6 +86,7 @@ public void testAppendNonTriggeringEvent() { LoggingEvent event = new LoggingEvent(); event.setThreadName("thead name"); event.setLevel(Level.DEBUG); + event.setLoggerContext(lc); appender.subAppend(cb, event); assertEquals(1, cb.length()); } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderMessageLossTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderMessageLossTest.java index 38eed549c6..62b5905b96 100755 --- a/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderMessageLossTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketAppenderMessageLossTest.java @@ -18,6 +18,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import org.junit.jupiter.api.Test; import ch.qos.logback.classic.Logger; @@ -88,6 +89,8 @@ public void runTest(SocketAppender socketAppender) throws Exception { final int port = RandomUtil.getRandomServerPort(); LoggerContext serverLoggerContext = new LoggerContext(); + LogbackMDCAdapter serverLogbackMDCAdapter = new LogbackMDCAdapter(); + serverLoggerContext.setMDCAdapter(serverLogbackMDCAdapter); serverLoggerContext.setName("serverLoggerContext"); CountDownLatch allMessagesReceivedLatch = new CountDownLatch(runLen); @@ -100,6 +103,9 @@ public void runTest(SocketAppender socketAppender) throws Exception { serverRootLogger.addAppender(listAppender); LoggerContext loggerContext = new LoggerContext(); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + loggerContext.setMDCAdapter(logbackMDCAdapter); + loggerContext.setName("clientLoggerContext"); socketAppender.setContext(loggerContext); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketReceiverTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketReceiverTest.java index ebcabc7a9b..66195dcfa3 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketReceiverTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/net/SocketReceiverTest.java @@ -30,6 +30,7 @@ import javax.net.SocketFactory; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -60,6 +61,8 @@ private MockSocketConnector connector; private MockAppender appender; private LoggerContext lc; + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + private Logger logger; private InstrumentedSocketReceiver receiver = new InstrumentedSocketReceiver(); @@ -71,6 +74,7 @@ public void setUp() throws Exception { connector = new MockSocketConnector(socket); lc = new LoggerContext(); + lc.setMDCAdapter(logbackMDCAdapter); lc.reset(); receiver.setContext(lc); appender = new MockAppender(); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java index d9cc2e3586..690f2cfbed 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/net/SyslogAppenderTest.java @@ -13,6 +13,7 @@ */ package ch.qos.logback.classic.net; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -41,6 +42,8 @@ public class SyslogAppenderTest { private static final String SYSLOG_PREFIX_REGEX = "<\\d{2}>\\w{3} [\\d ]\\d \\d{2}(:\\d{2}){2} [\\w.-]* "; LoggerContext lc = new LoggerContext(); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + SyslogAppender sa = new SyslogAppender(); MockSyslogServer mockServer; String loggerName = this.getClass().getName(); @@ -49,6 +52,7 @@ public class SyslogAppenderTest { @BeforeEach public void setUp() throws Exception { lc.setName("test"); + lc.setMDCAdapter(logbackMDCAdapter); sa.setContext(lc); } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverFunctionalTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverFunctionalTest.java index 8bd55c14c6..b8822b5884 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverFunctionalTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/net/server/ServerSocketReceiverFunctionalTest.java @@ -24,6 +24,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -54,10 +55,11 @@ public class ServerSocketReceiverFunctionalTest { private ServerSocket serverSocket; private InstrumentedServerSocketReceiver receiver; private LoggerContext lc; - + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); @BeforeEach public void setUp() throws Exception { lc = new LoggerContext(); + lc.setMDCAdapter(logbackMDCAdapter); appender = new MockAppender(); appender.start(); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java index fb37baf736..57e0264a7b 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java @@ -20,6 +20,7 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.net.SyslogConstants; import ch.qos.logback.core.pattern.DynamicConverter; @@ -28,7 +29,6 @@ import ch.qos.logback.core.util.StatusPrinter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.slf4j.MDC; import org.slf4j.MarkerFactory; import java.util.ArrayList; @@ -41,8 +41,9 @@ public class ConverterTest { - LoggerContext lc = new LoggerContext(); - Logger logger = lc.getLogger(ConverterTest.class); + LoggerContext loggerContext = new LoggerContext(); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + Logger logger = loggerContext.getLogger(ConverterTest.class); LoggingEvent le; List optionList = new ArrayList(); @@ -60,6 +61,7 @@ Exception getException(String msg, Exception cause) { @BeforeEach public void setUp() throws Exception { + loggerContext.setMDCAdapter(logbackMDCAdapter); Exception rootEx = getException("Innermost", null); Exception nestedEx = getException("Nested", rootEx); @@ -75,7 +77,7 @@ public void testLineOfCaller() { StringBuilder buf = new StringBuilder(); converter.write(buf, le); // the number below should be the line number of the previous line - assertEquals("76", buf.toString()); + assertEquals("78", buf.toString()); } } @@ -366,8 +368,8 @@ public void testSyslogStart() throws Exception { @Test public void testMDCConverter() throws Exception { - MDC.clear(); - MDC.put("someKey", "someValue"); + logbackMDCAdapter.clear(); + logbackMDCAdapter.put("someKey", "someValue"); MDCConverter converter = new MDCConverter(); this.optionList.clear(); this.optionList.add("someKey"); @@ -388,7 +390,7 @@ public void contextNameConverter() { lcOther.setName("another"); converter.setContext(lcOther); - lc.setName("aValue"); + loggerContext.setName("aValue"); ILoggingEvent event = makeLoggingEvent(null); String result = converter.convert(event); @@ -398,13 +400,13 @@ public void contextNameConverter() { @Test public void contextProperty() { PropertyConverter converter = new PropertyConverter(); - converter.setContext(lc); + converter.setContext(loggerContext); List ol = new ArrayList(); ol.add("k"); converter.setOptionList(ol); converter.start(); - lc.setName("aValue"); - lc.putProperty("k", "v"); + loggerContext.setName("aValue"); + loggerContext.putProperty("k", "v"); ILoggingEvent event = makeLoggingEvent(null); String result = converter.convert(event); @@ -415,7 +417,7 @@ public void contextProperty() { public void testSequenceNumber() { //lc.setSequenceNumberGenerator(new BasicSequenceNumberGenerator()); SequenceNumberConverter converter = new SequenceNumberConverter(); - converter.setContext(lc); + converter.setContext(loggerContext); converter.start(); assertTrue(converter.isStarted()); @@ -423,6 +425,6 @@ public void testSequenceNumber() { event.setSquenceNumber(123); assertEquals("123", converter.convert(event)); - StatusPrinter.print(lc); + StatusPrinter.print(loggerContext); } } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java index 36b9a9c904..974d380918 100755 --- a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java @@ -18,6 +18,7 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import ch.qos.logback.core.testUtil.RandomUtil; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -29,24 +30,24 @@ public class MDCConverterTest { - LoggerContext lc; + LoggerContext loggerContext; + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); MDCConverter converter; int diff = RandomUtil.getPositiveInt(); @BeforeEach public void setUp() throws Exception { - lc = new LoggerContext(); + loggerContext = new LoggerContext(); + loggerContext.setMDCAdapter(logbackMDCAdapter); converter = new MDCConverter(); converter.start(); - MDC.clear(); } @AfterEach public void tearDown() throws Exception { - lc = null; + loggerContext = null; converter.stop(); converter = null; - MDC.clear(); } @Test @@ -54,7 +55,7 @@ public void testConvertWithOneEntry() { String k = "MDCConverterTest_k" + diff; String v = "MDCConverterTest_v" + diff; - MDC.put(k, v); + logbackMDCAdapter.put(k, v); ILoggingEvent le = createLoggingEvent(); String result = converter.convert(le); assertEquals(k + "=" + v, result); @@ -62,8 +63,8 @@ public void testConvertWithOneEntry() { @Test public void testConvertWithMultipleEntries() { - MDC.put("testKey", "testValue"); - MDC.put("testKey2", "testValue2"); + logbackMDCAdapter.put("testKey", "testValue"); + logbackMDCAdapter.put("testKey2", "testValue2"); ILoggingEvent le = createLoggingEvent(); String result = converter.convert(le); boolean isConform = result.matches("testKey2?=testValue2?, testKey2?=testValue2?"); @@ -71,7 +72,7 @@ public void testConvertWithMultipleEntries() { } private ILoggingEvent createLoggingEvent() { - return new LoggingEvent(this.getClass().getName(), lc.getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, + return new LoggingEvent(this.getClass().getName(), loggerContext.getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", null, null); } } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java index c02ed3e6ca..7ee4bf83d7 100755 --- a/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/rolling/TimeBasedRollingWithConfigFileTest.java @@ -18,6 +18,7 @@ import ch.qos.logback.classic.LoggerContext; 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.CoreConstants; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.rolling.RollingFileAppender; @@ -38,9 +39,10 @@ public class TimeBasedRollingWithConfigFileTest extends ScaffoldingForRollingTests { - LoggerContext lc = new LoggerContext(); - StatusChecker statusChecker = new StatusChecker(lc); - Logger logger = lc.getLogger(this.getClass()); + LoggerContext loggerContext = new LoggerContext(); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + StatusChecker statusChecker = new StatusChecker(loggerContext); + Logger logger = loggerContext.getLogger(this.getClass()); int fileSize = 0; int fileIndexCounter = -1; int sizeThreshold; @@ -48,9 +50,10 @@ public class TimeBasedRollingWithConfigFileTest extends ScaffoldingForRollingTes @BeforeEach @Override public void setUp() { - lc.setName("test"); + loggerContext.setName("test"); + loggerContext.setMDCAdapter(logbackMDCAdapter); super.setUp(); - lc.putProperty("randomOutputDir", randomOutputDir); + loggerContext.putProperty("randomOutputDir", randomOutputDir); } @AfterEach @@ -59,7 +62,7 @@ public void tearDown() throws Exception { void loadConfig(String confifFile) throws JoranException { JoranConfigurator jc = new JoranConfigurator(); - jc.setContext(lc); + jc.setContext(loggerContext); jc.doConfigure(confifFile); currentTime = System.currentTimeMillis(); recomputeRolloverThreshold(currentTime); @@ -68,11 +71,11 @@ void loadConfig(String confifFile) throws JoranException { @Test public void basic() throws Exception { String testId = "basic"; - lc.putProperty("testId", testId); + loggerContext.putProperty("testId", testId); loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId + ".xml"); statusChecker.assertIsErrorFree(); - Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); + Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); expectedFilenameList.add(randomOutputDir + "z" + testId); @@ -97,30 +100,30 @@ public void basic() throws Exception { @Test public void depratedSizeAndTimeBasedFNATPWarning() throws Exception { String testId = "depratedSizeAndTimeBasedFNATPWarning"; - lc.putProperty("testId", testId); + loggerContext.putProperty("testId", testId); loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId + ".xml"); - StatusPrinter.print(lc); + StatusPrinter.print(loggerContext); statusChecker.assertContainsMatch(Status.WARN, CoreConstants.SIZE_AND_TIME_BASED_FNATP_IS_DEPRECATED); } @Test public void timeAndSize() throws Exception { String testId = "timeAndSize"; - lc.putProperty("testId", testId); + loggerContext.putProperty("testId", testId); String prefix = "Hello-----"; // the number of times the log file will be written to before time based // roll-over occurs int approxWritesPerPeriod = 64; sizeThreshold = prefix.length() * approxWritesPerPeriod; - lc.putProperty("sizeThreshold", "" + sizeThreshold); + loggerContext.putProperty("sizeThreshold", "" + sizeThreshold); loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId + ".xml"); - StatusPrinter.print(lc); + StatusPrinter.print(loggerContext); // Test http://jira.qos.ch/browse/LOGBACK-1236 statusChecker.assertNoMatch(CoreConstants.SIZE_AND_TIME_BASED_FNATP_IS_DEPRECATED); - Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); + Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); expectedFilenameList.add(randomOutputDir + "z" + testId); @@ -154,10 +157,10 @@ public void timeAndSize() throws Exception { public void timeAndSizeWithoutIntegerToken() throws Exception { String testId = "timeAndSizeWithoutIntegerToken"; loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId + ".xml"); - Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); + Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); expectedFilenameList.add(randomOutputDir + "z" + testId); RollingFileAppender rfa = (RollingFileAppender) root.getAppender("ROLLING"); - StatusPrinter.print(lc); + StatusPrinter.print(loggerContext); statusChecker.assertContainsMatch("Missing integer token"); assertFalse(rfa.isStarted()); @@ -168,21 +171,21 @@ public void timeAndSizeWithoutIntegerToken() throws Exception { public void timeAndSizeWithoutMaxFileSize() throws Exception { String testId = "timeAndSizeWithoutMaxFileSize"; loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId + ".xml"); - Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); + Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); // expectedFilenameList.add(randomOutputDir + "z" + testId); RollingFileAppender rfa = (RollingFileAppender) root.getAppender("ROLLING"); // statusChecker.assertContainsMatch("Missing integer token"); assertFalse(rfa.isStarted()); - StatusPrinter.print(lc); + StatusPrinter.print(loggerContext); } @Test public void totalSizeCapSmallerThanMaxFileSize() throws Exception { String testId = "totalSizeCapSmallerThanMaxFileSize"; - lc.putProperty("testId", testId); + loggerContext.putProperty("testId", testId); loadConfig(ClassicTestConstants.JORAN_INPUT_PREFIX + "rolling/" + testId + ".xml"); - Logger root = lc.getLogger(Logger.ROOT_LOGGER_NAME); + Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); // expectedFilenameList.add(randomOutputDir + "z" + testId); RollingFileAppender rfa = (RollingFileAppender) root.getAppender("ROLLING"); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/sift/MDCBasedDiscriminatorTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/sift/MDCBasedDiscriminatorTest.java index e452c06b41..9f87ef061c 100755 --- a/logback-classic/src/test/java/ch/qos/logback/classic/sift/MDCBasedDiscriminatorTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/sift/MDCBasedDiscriminatorTest.java @@ -17,6 +17,7 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import ch.qos.logback.core.testUtil.RandomUtil; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -36,8 +37,9 @@ public class MDCBasedDiscriminatorTest { static String DEFAULT_VAL = "DEFAULT_VAL"; MDCBasedDiscriminator discriminator = new MDCBasedDiscriminator(); - LoggerContext context = new LoggerContext(); - Logger logger = context.getLogger(this.getClass()); + LoggerContext loggerContext = new LoggerContext(); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); + Logger logger = loggerContext.getLogger(this.getClass()); int diff = RandomUtil.getPositiveInt(); String key = "MDCBasedDiscriminatorTest_key" + diff; @@ -46,8 +48,8 @@ public class MDCBasedDiscriminatorTest { @BeforeEach public void setUp() { - MDC.clear(); - discriminator.setContext(context); + loggerContext.setMDCAdapter(logbackMDCAdapter); + discriminator.setContext(loggerContext); discriminator.setKey(key); discriminator.setDefaultValue(DEFAULT_VAL); discriminator.start(); @@ -61,7 +63,7 @@ public void teaDown() { @Test public void smoke() { - MDC.put(key, value); + logbackMDCAdapter.put(key, value); event = new LoggingEvent("a", logger, Level.DEBUG, "", null, null); String discriminatorValue = discriminator.getDiscriminatingValue(event); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java index df2e569107..243cce5169 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/sift/SiftingAppenderTest.java @@ -22,6 +22,7 @@ import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import ch.qos.logback.core.Appender; import ch.qos.logback.core.Context; import ch.qos.logback.core.FileAppender; @@ -62,6 +63,7 @@ public class SiftingAppenderTest { static String SIFT_FOLDER_PREFIX = ClassicTestConstants.JORAN_INPUT_PREFIX + "sift/"; LoggerContext loggerContext = new LoggerContext(); + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); Logger logger = loggerContext.getLogger(this.getClass().getName()); Logger root = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); StatusChecker statusChecker = new StatusChecker(loggerContext); @@ -77,12 +79,12 @@ protected void configure(String file) throws JoranException { @BeforeEach public void setUp() { - MDC.clear(); + loggerContext.setMDCAdapter(logbackMDCAdapter); } @AfterEach public void tearDown() { - MDC.clear(); + } @Test @@ -161,17 +163,17 @@ public void fileAppenderCollision() throws JoranException, InterruptedException long timestamp = System.currentTimeMillis(); - MDC.put(key, "A-"+diff); + logbackMDCAdapter.put(key, "A-"+diff); logNewEventViaSiftingAppender(sa, timestamp); FileAppender fileAppenderA = (FileAppender) sa.getAppenderTracker().find("A-"+diff); assertNotNull(fileAppenderA); assertTrue(fileAppenderA.isStarted()); timestamp += ComponentTracker.DEFAULT_TIMEOUT + 1; - MDC.put(key, "B-"+diff); + logbackMDCAdapter.put(key, "B-"+diff); logNewEventViaSiftingAppender(sa, timestamp); assertFalse(fileAppenderA.isStarted()); - - MDC.put(key, "A-"+diff); + + logbackMDCAdapter.put(key, "A-"+diff); timestamp += 1; logNewEventViaSiftingAppender(sa, timestamp); FileAppender fileAppenderA_2 = (FileAppender) sa.getAppenderTracker().find("A-"+diff); @@ -189,7 +191,7 @@ private void logNewEventViaSiftingAppender(SiftingAppender sa, long timestamp) { public void testWholeCycle() throws JoranException { String mdcKey = "cycle"; configure(SIFT_FOLDER_PREFIX + "completeCycle.xml"); - MDC.put(mdcKey, "a"); + logbackMDCAdapter.put(mdcKey, "a"); logger.debug("smoke"); long timestamp = System.currentTimeMillis(); SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT"); @@ -199,7 +201,7 @@ public void testWholeCycle() throws JoranException { assertEquals(1, listAppender.list.size()); assertEquals("smoke", eventList.get(0).getMessage()); - MDC.remove(mdcKey); + logbackMDCAdapter.remove(mdcKey); logNewEventViaSiftingAppender(sa, timestamp); assertFalse(listAppender.isStarted()); assertEquals(1, sa.getAppenderTracker().allKeys().size()); @@ -211,7 +213,7 @@ public void sessionFinalizationShouldCauseLingering() throws JoranException { String mdcKey = "linger"; String mdcVal = "session" + diff; configure(SIFT_FOLDER_PREFIX + "lingering.xml"); - MDC.put(mdcKey, mdcVal); + logbackMDCAdapter.put(mdcKey, mdcVal); logger.debug("linger 1"); logger.debug(ClassicConstants.FINALIZE_SESSION_MARKER, "linger 2"); long now = System.currentTimeMillis(); @@ -236,7 +238,8 @@ public void localPropertiesShouldBeVisible() throws JoranException { String msg = "localPropertiesShouldBeVisible"; String prefix = "Y"; configure(SIFT_FOLDER_PREFIX + "propertyPropagation.xml"); - MDC.put(mdcKey, mdcVal); + + logbackMDCAdapter.put(mdcKey, mdcVal); logger.debug(msg); SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT"); StringListAppender listAppender = (StringListAppender) sa.getAppenderTracker().find(mdcVal); @@ -253,7 +256,7 @@ public void propertyDefinedWithinSiftElementShouldBeVisible() throws JoranExcept String msg = "propertyDefinedWithinSiftElementShouldBeVisible"; String prefix = "Y"; configure(SIFT_FOLDER_PREFIX + "propertyDefinedInSiftElement.xml"); - MDC.put(mdcKey, mdcVal); + logbackMDCAdapter.put(mdcKey, mdcVal); logger.debug(msg); SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT"); StringListAppender listAppender = (StringListAppender) sa.getAppenderTracker().find(mdcVal); @@ -270,7 +273,7 @@ public void compositePropertyShouldCombineWithinAndWithoutSiftElement() throws J String msg = "compositePropertyShouldCombineWithinAndWithoutSiftElement"; String prefix = "composite"; configure(SIFT_FOLDER_PREFIX + "compositeProperty.xml"); - MDC.put(mdcKey, mdcVal); + logbackMDCAdapter.put(mdcKey, mdcVal); logger.debug(msg); SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT"); StringListAppender listAppender = (StringListAppender) sa.getAppenderTracker().find(mdcVal); @@ -287,7 +290,7 @@ public void maxAppendersCountPropertyShouldBeHonored() throws JoranException { SiftingAppender sa = (SiftingAppender) root.getAppender("SIFT"); String mdcKey = "max"; for (int i = 0; i <= max; i++) { - MDC.put(mdcKey, "" + (diff + i)); + logbackMDCAdapter.put(mdcKey, "" + (diff + i)); LoggingEvent event = new LoggingEvent("", logger, Level.DEBUG, "max" + i, null, null); event.setTimeStamp(now); sa.doAppend(event); @@ -380,13 +383,13 @@ public Appender buildAppender(Context context, String discriminat logger.setLevel(Level.DEBUG); logger.setAdditive(false); - MDC.put("SKEY", "K1"); + logbackMDCAdapter.put("SKEY", "K1"); logger.info("bla1"); - MDC.clear(); + logbackMDCAdapter.clear(); - MDC.put("SKEY", "K2"); + logbackMDCAdapter.put("SKEY", "K2"); logger.info("bla2"); - MDC.clear(); + logbackMDCAdapter.clear(); //StatusPrinter.print(loggerContext); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java index 70d016f6e6..e3fb7037bd 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java @@ -18,6 +18,7 @@ import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.net.LoggingEventPreSerializationTransformer; import ch.qos.logback.classic.net.server.HardenedLoggingEventInputStream; +import ch.qos.logback.classic.util.LogbackMDCAdapter; import ch.qos.logback.core.spi.PreSerializationTransformer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -42,6 +43,7 @@ public class LoggingEventSerializationTest { LoggerContext loggerContext; + LogbackMDCAdapter logbackMDCAdapter = new LogbackMDCAdapter(); Logger logger; ByteArrayOutputStream bos; @@ -53,6 +55,7 @@ public class LoggingEventSerializationTest { public void setUp() throws Exception { loggerContext = new LoggerContext(); loggerContext.setName("testContext"); + loggerContext.setMDCAdapter(logbackMDCAdapter); logger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); // create the byte output stream bos = new ByteArrayOutputStream(); @@ -93,7 +96,7 @@ public void context() throws Exception { @Test public void MDC() throws Exception { - MDC.put("key", "testValue"); + logbackMDCAdapter.put("key", "testValue"); ILoggingEvent event = createLoggingEvent(); ILoggingEvent remoteEvent = writeAndRead(event); checkForEquality(event, remoteEvent); @@ -103,12 +106,12 @@ public void MDC() throws Exception { @Test public void updatedMDC() throws Exception { - MDC.put("key", "testValue"); + logbackMDCAdapter.put("key", "testValue"); ILoggingEvent event1 = createLoggingEvent(); Serializable s1 = pst.transform(event1); oos.writeObject(s1); - MDC.put("key", "updatedTestValue"); + logbackMDCAdapter.put("key", "updatedTestValue"); ILoggingEvent event2 = createLoggingEvent(); Serializable s2 = pst.transform(event2); oos.writeObject(s2); diff --git a/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java b/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java index af00bbd640..4e5325082d 100644 --- a/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java +++ b/logback-core/src/main/java/ch/qos/logback/core/CoreConstants.java @@ -222,4 +222,5 @@ public class CoreConstants { public static final String SIZE_AND_TIME_BASED_FNATP_IS_DEPRECATED = "SizeAndTimeBasedFNATP is deprecated. Use SizeAndTimeBasedRollingPolicy instead"; public static final String LOGBACK_CLASSIC_VERSION_MESSAGE = "This is logback-classic version "; + public static final char JSON_LINE_SEPARATOR = '\n'; }