diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java index d4bec28fb6d..f7aad8dee29 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import java.util.logging.ConsoleHandler; import java.util.logging.Handler; @@ -45,6 +46,7 @@ import org.apache.logging.log4j.core.filter.AbstractFilter; import org.apache.logging.log4j.core.util.NameUtil; import org.apache.logging.log4j.jul.Log4jBridgeHandler; import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.util.PropertiesUtil; import org.springframework.boot.context.properties.bind.BindResult; import org.springframework.boot.context.properties.bind.Bindable; @@ -71,6 +73,7 @@ import org.springframework.util.StringUtils; * @author Andy Wilkinson * @author Alexander Heusingfeld * @author Ben Hale + * @author Ralph Goers * @since 1.2.0 */ public class Log4J2LoggingSystem extends AbstractLoggingSystem { @@ -123,32 +126,29 @@ public class Log4J2LoggingSystem extends AbstractLoggingSystem { @Override protected String[] getStandardConfigLocations() { - return getCurrentlySupportedConfigLocations(); - } - - private String[] getCurrentlySupportedConfigLocations() { - List supportedConfigLocations = new ArrayList<>(); - addTestFiles(supportedConfigLocations); - supportedConfigLocations.add("log4j2.properties"); + List locations = new ArrayList<>(); + locations.add("log4j2-test.properties"); if (isClassAvailable("com.fasterxml.jackson.dataformat.yaml.YAMLParser")) { - Collections.addAll(supportedConfigLocations, "log4j2.yaml", "log4j2.yml"); + Collections.addAll(locations, "log4j2-test.yaml", "log4j2-test.yml"); } if (isClassAvailable("com.fasterxml.jackson.databind.ObjectMapper")) { - Collections.addAll(supportedConfigLocations, "log4j2.json", "log4j2.jsn"); + Collections.addAll(locations, "log4j2-test.json", "log4j2-test.jsn"); } - supportedConfigLocations.add("log4j2.xml"); - return StringUtils.toStringArray(supportedConfigLocations); - } - - private void addTestFiles(List supportedConfigLocations) { - supportedConfigLocations.add("log4j2-test.properties"); + locations.add("log4j2-test.xml"); + locations.add("log4j2.properties"); if (isClassAvailable("com.fasterxml.jackson.dataformat.yaml.YAMLParser")) { - Collections.addAll(supportedConfigLocations, "log4j2-test.yaml", "log4j2-test.yml"); + Collections.addAll(locations, "log4j2.yaml", "log4j2.yml"); } if (isClassAvailable("com.fasterxml.jackson.databind.ObjectMapper")) { - Collections.addAll(supportedConfigLocations, "log4j2-test.json", "log4j2-test.jsn"); + Collections.addAll(locations, "log4j2.json", "log4j2.jsn"); + } + locations.add("log4j2.xml"); + String propertyDefinedLocation = new PropertiesUtil(new Properties()) + .getStringProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); + if (propertyDefinedLocation != null) { + locations.add(propertyDefinedLocation); } - supportedConfigLocations.add("log4j2-test.xml"); + return StringUtils.toStringArray(locations); } protected boolean isClassAvailable(String className) { diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java index a6ff8a1309d..6045e50a3f3 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystemTests.java @@ -35,6 +35,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.ConfigurationFactory; import org.apache.logging.log4j.core.config.LoggerConfig; import org.apache.logging.log4j.core.config.Reconfigurable; import org.apache.logging.log4j.core.config.composite.CompositeConfiguration; @@ -295,6 +296,18 @@ class Log4J2LoggingSystemTests extends AbstractLoggingSystemTests { "log4j2.properties", "log4j2.yaml", "log4j2.yml", "log4j2.json", "log4j2.jsn", "log4j2.xml"); } + @Test + void configLocationsWithConfigurationFileSystemProperty() { + System.setProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "custom-log4j2.properties"); + try { + assertThat(this.loggingSystem.getStandardConfigLocations()).contains("log4j2-test.properties", + "log4j2-test.xml", "log4j2.properties", "log4j2.xml"); + } + finally { + System.clearProperty(ConfigurationFactory.CONFIGURATION_FILE_PROPERTY); + } + } + @Test void springConfigLocations() { String[] locations = getSpringConfigLocations(this.loggingSystem);