diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactory.java index 213f40ab4e..e9ff22905e 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactory.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactory.java @@ -27,12 +27,18 @@ import org.apache.logging.log4j.core.config.plugins.Plugin; import org.springframework.boot.logging.LoggingSystem; /** - * Spring Boot {@link ConfigurationFactory} that prevents logger warnings from being - * printed when the application first starts. This factory is ordered last and is - * triggered by a {@code log4j2.springboot} classpath resource (which is bundled in this - * jar). If the {@link Log4J2LoggingSystem} is active, a {@link DefaultConfiguration} is - * returned with the expectation that the system will later re-initialize Log4J2 with the - * correct configuration file. + * Spring Boot {@link ConfigurationFactory} that customizes Log4J2's default configuration + * to: + * + *
    + *
  1. Prevent logger warnings from being printed when the application first starts. + *
  2. Disable its shutdown hook + *
+ * + * This factory is ordered last and is triggered by a {@code log4j2.springboot} classpath + * resource (which is bundled in this jar). If the {@link Log4J2LoggingSystem} is active, + * a custom {@link DefaultConfiguration} is returned with the expectation that the system + * will later re-initialize Log4J2 with the correct configuration file. * * @author Phillip Webb * @since 1.5.0 @@ -53,9 +59,17 @@ public class SpringBootConfigurationFactory extends ConfigurationFactory { ConfigurationSource source) { if (source != null && source != ConfigurationSource.NULL_SOURCE && LoggingSystem.get(loggerContext.getClass().getClassLoader()) != null) { - return new DefaultConfiguration(); + return new SpringBootConfiguration(); } return null; } + private static final class SpringBootConfiguration extends DefaultConfiguration { + + private SpringBootConfiguration() { + this.isShutdownHookEnabled = false; + } + + } + } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactoryTests.java new file mode 100644 index 0000000000..f0babc7862 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/SpringBootConfigurationFactoryTests.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2018 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.logging.log4j2; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.ConfigurationSource; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SpringBootConfigurationFactory}. + * + * @author Andy Wilkinson + */ +public class SpringBootConfigurationFactoryTests { + + @Test + public void producesConfigurationWithShutdownHookDisabled() throws IOException { + ConfigurationSource source = new ConfigurationSource( + new ByteArrayInputStream(new byte[0])); + assertThat(new SpringBootConfigurationFactory() + .getConfiguration(new LoggerContext(""), source).isShutdownHookEnabled()) + .isFalse(); + } + +}