diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 1e325ea684a8..e3a0221c3d94 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1121,7 +1121,7 @@ bom { releaseNotes("https://github.com/apache/logging-log4j2/releases/tag/rel%2F{version}") } } - library("Logback", "1.5.6") { + library("Logback", "1.5.7") { group("ch.qos.logback") { modules = [ "logback-classic", diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java index abba6c24c41d..6712419f81a5 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.boot.logging.logback; import java.nio.charset.Charset; +import java.util.concurrent.locks.ReentrantLock; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; @@ -44,6 +45,7 @@ * @author Robert Thornton * @author Scott Frederick * @author Jonatan Ivanov + * @author Mark Chesney */ class DefaultLogbackConfiguration { @@ -54,7 +56,9 @@ class DefaultLogbackConfiguration { } void apply(LogbackConfigurator config) { - synchronized (config.getConfigurationLock()) { + ReentrantLock lock = config.getConfigurationLock(); + lock.lock(); + try { defaults(config); Appender consoleAppender = consoleAppender(config); if (this.logFile != null) { @@ -65,6 +69,9 @@ void apply(LogbackConfigurator config) { config.root(Level.INFO, consoleAppender); } } + finally { + lock.unlock(); + } } private void defaults(LogbackConfigurator config) { diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackConfigurator.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackConfigurator.java index b57e5d80dbf9..e557c1724c96 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackConfigurator.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackConfigurator.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; @@ -35,6 +36,7 @@ * Allows programmatic configuration of logback which is usually faster than parsing XML. * * @author Phillip Webb + * @author Mark Chesney */ class LogbackConfigurator { @@ -49,7 +51,7 @@ LoggerContext getContext() { return this.context; } - Object getConfigurationLock() { + ReentrantLock getConfigurationLock() { return this.context.getConfigurationLock(); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemParallelInitializationTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemParallelInitializationTests.java index 4624be2a5097..f8a6bda4c756 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemParallelInitializationTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemParallelInitializationTests.java @@ -36,6 +36,7 @@ * control over how and when the logging system is initialized. * * @author Andy Wilkinson + * @author Mark Chesney */ class LogbackLoggingSystemParallelInitializationTests { @@ -45,6 +46,7 @@ class LogbackLoggingSystemParallelInitializationTests { void cleanUp() { this.loggingSystem.cleanUp(); ((LoggerContext) LoggerFactory.getILoggerFactory()).stop(); + ((LoggerContext) LoggerFactory.getILoggerFactory()).reset(); } @Test diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java index 995c25f8804b..b3e4af667a35 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java @@ -44,6 +44,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import org.slf4j.ILoggerFactory; import org.slf4j.LoggerFactory; import org.slf4j.MDC; @@ -93,8 +94,9 @@ * @author Scott Frederick * @author Jonatan Ivanov * @author Moritz Halbritter + * @author Mark Chesney */ -@ExtendWith(OutputCaptureExtension.class) +@ExtendWith({ MockitoExtension.class, OutputCaptureExtension.class }) @ClassPathExclusions({ "log4j-core-*.jar", "log4j-api-*.jar" }) class LogbackLoggingSystemTests extends AbstractLoggingSystemTests { @@ -128,6 +130,7 @@ void cleanUp() { System.getProperties().keySet().retainAll(this.systemPropertyNames); this.loggingSystem.cleanUp(); ((LoggerContext) LoggerFactory.getILoggerFactory()).stop(); + ((LoggerContext) LoggerFactory.getILoggerFactory()).reset(); } @Test diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java index beab88321a33..d680800ab4c8 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/logback/SpringBootJoranConfiguratorTests.java @@ -43,6 +43,7 @@ * @author Phillip Webb * @author EddĂș MelĂ©ndez * @author Stephane Nicoll + * @author Mark Chesney */ @ExtendWith(OutputCaptureExtension.class) class SpringBootJoranConfiguratorTests { @@ -72,6 +73,7 @@ void setup(CapturedOutput output) { @AfterEach void reset() { this.context.stop(); + this.context.reset(); new BasicConfigurator().configure((LoggerContext) LoggerFactory.getILoggerFactory()); }