diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java index 2d8c69b1e1a..3fe1f4dbf53 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingApplicationListener.java @@ -145,7 +145,8 @@ public class LoggingApplicationListener implements SmartApplicationListener { onApplicationEnvironmentPreparedEvent( (ApplicationEnvironmentPreparedEvent) event); } - else if (event instanceof ContextClosedEvent) { + else if (event instanceof ContextClosedEvent && ((ContextClosedEvent) event) + .getApplicationContext().getParent() == null) { onContextClosedEvent(); } } diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java index d4bf7d11a16..4f77af2f0dd 100644 --- a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingApplicationListenerTests.java @@ -39,8 +39,10 @@ import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.boot.test.OutputCapture; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.test.util.ReflectionTestUtils; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; @@ -86,6 +88,7 @@ public class LoggingApplicationListenerTests { System.clearProperty("LOG_FILE"); System.clearProperty("LOG_PATH"); System.clearProperty("PID"); + System.clearProperty(LoggingSystem.SYSTEM_PROPERTY); if (this.context != null) { this.context.close(); } @@ -302,6 +305,37 @@ public class LoggingApplicationListenerTests { assertFalse(bridgeHandlerInstalled()); } + @Test + public void closingContextCleansUpLoggingSystem() { + System.setProperty(LoggingSystem.SYSTEM_PROPERTY, + TestCleanupLoggingSystem.class.getName()); + this.initializer.onApplicationEvent( + new ApplicationStartedEvent(this.springApplication, new String[0])); + TestCleanupLoggingSystem loggingSystem = (TestCleanupLoggingSystem) ReflectionTestUtils + .getField(this.initializer, "loggingSystem"); + assertThat(loggingSystem.cleanedUp, is(false)); + this.initializer.onApplicationEvent(new ContextClosedEvent(this.context)); + assertThat(loggingSystem.cleanedUp, is(true)); + } + + @Test + public void closingChildContextDoesNotCleanUpLoggingSystem() { + System.setProperty(LoggingSystem.SYSTEM_PROPERTY, + TestCleanupLoggingSystem.class.getName()); + this.initializer.onApplicationEvent( + new ApplicationStartedEvent(this.springApplication, new String[0])); + TestCleanupLoggingSystem loggingSystem = (TestCleanupLoggingSystem) ReflectionTestUtils + .getField(this.initializer, "loggingSystem"); + assertThat(loggingSystem.cleanedUp, is(false)); + GenericApplicationContext childContext = new GenericApplicationContext(); + childContext.setParent(this.context); + this.initializer.onApplicationEvent(new ContextClosedEvent(childContext)); + assertThat(loggingSystem.cleanedUp, is(false)); + this.initializer.onApplicationEvent(new ContextClosedEvent(this.context)); + assertThat(loggingSystem.cleanedUp, is(true)); + childContext.close(); + } + private boolean bridgeHandlerInstalled() { Logger rootLogger = LogManager.getLogManager().getLogger(""); Handler[] handlers = rootLogger.getHandlers(); @@ -312,4 +346,34 @@ public class LoggingApplicationListenerTests { } return false; } + + static final class TestCleanupLoggingSystem extends LoggingSystem { + + private boolean cleanedUp = false; + + public TestCleanupLoggingSystem(ClassLoader classLoader) { + + } + + @Override + public void beforeInitialize() { + + } + + @Override + public void initialize(String configLocation, LogFile logFile) { + + } + + @Override + public void setLogLevel(String loggerName, LogLevel level) { + + } + + @Override + public void cleanUp() { + this.cleanedUp = true; + } + + } }