From 22e0a50a11cbcfaaf130f08a7f8fa53d89e9579b Mon Sep 17 00:00:00 2001 From: Thomas Recloux Date: Tue, 8 Sep 2015 17:36:58 +0200 Subject: [PATCH 1/3] Propagates logback log levels to java.util.logging Adds the LevelChangePropagator logback listener in order to propagate Logback's log level changes to java.util.logging loggers. Logback documentation : http://logback.qos.ch/manual/configuration.html#LevelChangePropagator Fixes gh-3924 Closes gh-3926 --- .../boot/logging/Slf4JLoggingSystem.java | 6 ++--- .../logging/logback/LogbackLoggingSystem.java | 22 +++++++++++++++---- .../logback/LogbackLoggingSystemTests.java | 12 ++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) 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 ca9796d3db..d9f6834c6d 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 @@ -46,7 +46,7 @@ public abstract class Slf4JLoggingSystem extends AbstractLoggingSystem { private void configureJdkLoggingBridgeHandler() { try { - if (bridgeHandlerIsAvailable()) { + if (isBridgeHandlerAvailable()) { removeJdkLoggingBridgeHandler(); SLF4JBridgeHandler.install(); } @@ -56,13 +56,13 @@ public abstract class Slf4JLoggingSystem extends AbstractLoggingSystem { } } - private boolean bridgeHandlerIsAvailable() { + protected final boolean isBridgeHandlerAvailable() { return ClassUtils.isPresent(BRIDGE_HANDLER, getClassLoader()); } private void removeJdkLoggingBridgeHandler() { try { - if (bridgeHandlerIsAvailable()) { + if (isBridgeHandlerAvailable()) { try { SLF4JBridgeHandler.removeHandlersForRootLogger(); } 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 4756be2486..6f7369e382 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 @@ -37,6 +37,7 @@ import org.springframework.util.StringUtils; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.jul.LevelChangePropagator; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.classic.util.ContextInitializer; import ch.qos.logback.core.spi.FilterReply; @@ -99,8 +100,7 @@ public class LogbackLoggingSystem extends Slf4JLoggingSystem { @Override protected void loadDefaults(LogFile logFile) { LoggerContext context = getLoggerContext(); - context.stop(); - context.reset(); + stopAndReset(context); LogbackConfigurator configurator = new LogbackConfigurator(context); new DefaultLogbackConfiguration(logFile).apply(configurator); } @@ -112,8 +112,7 @@ public class LogbackLoggingSystem extends Slf4JLoggingSystem { logFile.applyToSystemProperties(); } LoggerContext context = getLoggerContext(); - context.stop(); - context.reset(); + stopAndReset(context); try { URL url = ResourceUtils.getURL(location); new ContextInitializer(context).configureByResource(url); @@ -124,6 +123,21 @@ public class LogbackLoggingSystem extends Slf4JLoggingSystem { } } + private void stopAndReset(LoggerContext loggerContext) { + loggerContext.stop(); + loggerContext.reset(); + if (isBridgeHandlerAvailable()) { + addLevelChangePropagator(loggerContext); + } + } + + private void addLevelChangePropagator(LoggerContext loggerContext) { + LevelChangePropagator levelChangePropagator = new LevelChangePropagator(); + levelChangePropagator.setResetJUL(true); + levelChangePropagator.setContext(loggerContext); + loggerContext.addListener(levelChangePropagator); + } + @Override protected void reinitialize() { getLoggerContext().reset(); 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 d48299e1e8..bb2e66b351 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 @@ -146,6 +146,18 @@ public class LogbackLoggingSystemTests extends AbstractLoggingSystemTests { assertTrue("Wrong output:\n" + output, output.contains("Hello world")); } + @Test + public void loggingLevelIsPropagatedToJulI() { + this.loggingSystem.beforeInitialize(); + this.loggingSystem.initialize(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(); From b7e9f805c94e67b56d9c3a9cc201c19dc2e759f9 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 10 Sep 2015 14:49:41 -0700 Subject: [PATCH 2/3] Set ignoreUnknownFields=true on ServerProperties Update ServerProperties so that unknown SERVER_* environment properties do not cause startup failures. Fixes gh-3903 --- .../boot/autoconfigure/web/ServerProperties.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java index eeda381f9a..4c827d890a 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java @@ -56,7 +56,7 @@ import org.springframework.util.StringUtils; * @author Andy Wilkinson * @author Ivan Sopov */ -@ConfigurationProperties(prefix = "server", ignoreUnknownFields = false) +@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) public class ServerProperties implements EmbeddedServletContainerCustomizer, Ordered { /** From a5430d8a0c8367c5c0646da6b78374295bd33737 Mon Sep 17 00:00:00 2001 From: Pei-Tang Huang Date: Mon, 27 Jul 2015 17:29:45 +0800 Subject: [PATCH 3/3] Catch more general Hibernate 4.2 LinkageError Update HibernateJpaAutoConfiguration to catch LinkageError rather than NoClassDefFoundError. Required due to the fact that JBoss EAP 6 wraps NoClassDefFoundErrors. Fixes gh-3605 --- .../autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java index a53a66c545..ca6b64f8bc 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.java @@ -147,8 +147,9 @@ public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration { vendorProperties.put(JTA_PLATFORM, new SpringJtaPlatform( jtaTransactionManager)); } - catch (NoClassDefFoundError ex) { - // Can happen if Hibernate 4.2 is used + catch (LinkageError ex) { + // NoClassDefFoundError can happen if Hibernate 4.2 is used and some + // containers (e.g. JBoss EAP 6) wraps it in the superclass LinkageError if (!isUsingJndi()) { throw new IllegalStateException("Unable to set Hibernate JTA " + "platform, are you using the correct "