diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java index ca9796d3db03..747d66397638 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/Slf4JLoggingSystem.java @@ -56,7 +56,7 @@ private void configureJdkLoggingBridgeHandler() { } } - private boolean bridgeHandlerIsAvailable() { + protected boolean bridgeHandlerIsAvailable() { return ClassUtils.isPresent(BRIDGE_HANDLER, getClassLoader()); } diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java index ce5998f619e2..27d86a66b3e2 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/logback/LogbackLoggingSystem.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; +import ch.qos.logback.classic.jul.LevelChangePropagator; import org.slf4j.ILoggerFactory; import org.slf4j.Logger; import org.slf4j.Marker; @@ -108,6 +109,7 @@ protected void loadDefaults(LoggingInitializationContext initializationContext, LoggerContext context = getLoggerContext(); context.stop(); context.reset(); + configureJdkLoggingLevelPropagator(); LogbackConfigurator configurator = new LogbackConfigurator(context); new DefaultLogbackConfiguration(initializationContext, logFile) .apply(configurator); @@ -123,6 +125,7 @@ protected void loadConfiguration(LoggingInitializationContext initializationCont LoggerContext loggerContext = getLoggerContext(); loggerContext.stop(); loggerContext.reset(); + configureJdkLoggingLevelPropagator(); try { configureByResourceUrl(initializationContext, loggerContext, ResourceUtils.getURL(location)); @@ -176,6 +179,17 @@ private void configureJBossLoggingToUseSlf4j() { System.setProperty("org.jboss.logging.provider", "slf4j"); } + private void configureJdkLoggingLevelPropagator() { + if (bridgeHandlerIsAvailable()) { + LoggerContext loggerContext = getLoggerContext(); + + LevelChangePropagator levelChangePropagator = new LevelChangePropagator(); + levelChangePropagator.setResetJUL(true); + levelChangePropagator.setContext(loggerContext); + loggerContext.addListener(levelChangePropagator); + } + } + @Override public void setLogLevel(String loggerName, LogLevel level) { getLogger(loggerName).setLevel(LEVELS.get(level)); diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java index 9fce396d2cc8..1db49aece1cf 100644 --- a/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/logging/logback/LogbackLoggingSystemTests.java @@ -170,6 +170,18 @@ public void loggingThatUsesJulIsCaptured() { assertTrue("Wrong output:\n" + output, output.contains("Hello world")); } + @Test + public void loggingLevelIsPropagatedToJulI() { + this.loggingSystem.beforeInitialize(); + this.loggingSystem.initialize(this.initializationContext, null, null); + this.loggingSystem.setLogLevel(getClass().getName(), LogLevel.DEBUG); + java.util.logging.Logger julLogger = java.util.logging.Logger + .getLogger(getClass().getName()); + julLogger.fine("Hello debug world"); + String output = this.output.toString().trim(); + assertTrue("Wrong output:\n" + output, output.contains("Hello debug world")); + } + @Test public void jbossLoggingIsConfiguredToUseSlf4j() { this.loggingSystem.beforeInitialize();