diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 7b79229dc3..dc2a00dcb8 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1141,7 +1141,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 8b92cfe291..e79a90687c 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; @@ -51,6 +52,7 @@ import org.springframework.util.StringUtils; * @author Scott Frederick * @author Jonatan Ivanov * @author Moritz Halbritter + * @author Mark Chesney */ class DefaultLogbackConfiguration { @@ -80,7 +82,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) { @@ -91,6 +95,9 @@ class DefaultLogbackConfiguration { 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 b57e5d80db..a64f1ce1f5 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package org.springframework.boot.logging.logback; 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; @@ -49,7 +50,7 @@ class LogbackConfigurator { 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 4624be2a50..0e98609fb1 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 @@ -45,6 +45,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 d8a9d4fd5e..41c720d1ea 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 @@ -127,6 +127,7 @@ class LogbackLoggingSystemTests extends AbstractLoggingSystemTests { 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 beab88321a..28d3c930e7 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 @@ -72,6 +72,7 @@ class SpringBootJoranConfiguratorTests { @AfterEach void reset() { this.context.stop(); + this.context.reset(); new BasicConfigurator().configure((LoggerContext) LoggerFactory.getILoggerFactory()); }