From ddfadce94d02ff7cc5484fde7acd3478ace6dea2 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 11 Feb 2016 17:49:44 +0000 Subject: [PATCH] Set all documented system properties in LoggingApplicationListener Closes gh-5073 --- .../logging/LoggingApplicationListener.java | 67 +++++++++++++++---- .../logging/log4j/Log4JLoggingSystem.java | 5 +- .../logging/log4j2/Log4J2LoggingSystem.java | 3 - .../logging/logback/LogbackLoggingSystem.java | 3 - .../LoggingApplicationListenerTests.java | 24 ++++++- 5 files changed, 77 insertions(+), 25 deletions(-) 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 2703ec1141..d2b98ef84f 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 @@ -109,6 +109,31 @@ public class LoggingApplicationListener implements GenericApplicationListener { */ public static final String EXCEPTION_CONVERSION_WORD = "LOG_EXCEPTION_CONVERSION_WORD"; + /** + * The name of the System property that contains the log file. + */ + public static final String LOG_FILE = "LOG_FILE"; + + /** + * The name of the System property that contains the log file. + */ + public static final String LOG_PATH = "LOG_PATH"; + + /** + * The name of the System property that contains the console log pattern + */ + public static final String CONSOLE_LOG_PATTERN = "CONSOLE_LOG_PATTERN"; + + /** + * The name of the System property that contains the file log pattern + */ + public static final String FILE_LOG_PATTERN = "FILE_LOG_PATTERN"; + + /** + * The name of the System property that contains the log level pattern + */ + public static final String LOG_LEVEL_PATTERN = "LOG_LEVEL_PATTERN"; + /** * The name of the {@link LoggingSystem} bean. */ @@ -222,23 +247,38 @@ public class LoggingApplicationListener implements GenericApplicationListener { */ protected void initialize(ConfigurableEnvironment environment, ClassLoader classLoader) { - if (System.getProperty(PID_KEY) == null) { - System.setProperty(PID_KEY, new ApplicationPid().toString()); - } - if (System.getProperty(EXCEPTION_CONVERSION_WORD) == null) { - System.setProperty(EXCEPTION_CONVERSION_WORD, - getExceptionConversionWord(environment)); - } + LogFile logFile = LogFile.get(environment); + setSystemProperties(environment, logFile); initializeEarlyLoggingLevel(environment); - initializeSystem(environment, this.loggingSystem); + initializeSystem(environment, this.loggingSystem, logFile); initializeFinalLoggingLevels(environment, this.loggingSystem); registerShutdownHookIfNecessary(environment, this.loggingSystem); } - private String getExceptionConversionWord(ConfigurableEnvironment environment) { - RelaxedPropertyResolver resolver = new RelaxedPropertyResolver(environment, - "logging."); - return resolver.getProperty("exception-conversion-word", "%wEx"); + private void setSystemProperties(ConfigurableEnvironment environment, + LogFile logFile) { + RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver( + environment, "logging."); + setSystemProperty(propertyResolver, EXCEPTION_CONVERSION_WORD, + "exception-conversion-word"); + setSystemProperty(propertyResolver, CONSOLE_LOG_PATTERN, "pattern.console"); + setSystemProperty(propertyResolver, FILE_LOG_PATTERN, "pattern.file"); + setSystemProperty(propertyResolver, LOG_LEVEL_PATTERN, "pattern.level"); + setSystemProperty(PID_KEY, new ApplicationPid().toString()); + if (logFile != null) { + logFile.applyToSystemProperties(); + } + } + + private void setSystemProperty(RelaxedPropertyResolver propertyResolver, + String systemPropertyName, String propertyName) { + setSystemProperty(systemPropertyName, propertyResolver.getProperty(propertyName)); + } + + private void setSystemProperty(String name, String value) { + if (System.getProperty(name) == null && value != null) { + System.setProperty(name, value); + } } private void initializeEarlyLoggingLevel(ConfigurableEnvironment environment) { @@ -253,10 +293,9 @@ public class LoggingApplicationListener implements GenericApplicationListener { } private void initializeSystem(ConfigurableEnvironment environment, - LoggingSystem system) { + LoggingSystem system, LogFile logFile) { LoggingInitializationContext initializationContext = new LoggingInitializationContext( environment); - LogFile logFile = LogFile.get(environment); String logConfig = environment.getProperty(CONFIG_PROPERTY); if (ignoreLogConfig(logConfig)) { system.initialize(initializationContext, null, logFile); diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java index cb6e954c91..f59ea80938 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/log4j/Log4JLoggingSystem.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 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. @@ -93,9 +93,6 @@ public class Log4JLoggingSystem extends Slf4JLoggingSystem { protected void loadConfiguration(String location, LogFile logFile) { Assert.notNull(location, "Location must not be null"); - if (logFile != null) { - logFile.applyToSystemProperties(); - } try { Log4jConfigurer.initLogging(location); } diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java b/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java index 625f439c7b..ed8c8f0265 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/log4j2/Log4J2LoggingSystem.java @@ -157,9 +157,6 @@ public class Log4J2LoggingSystem extends Slf4JLoggingSystem { protected void loadConfiguration(String location, LogFile logFile) { Assert.notNull(location, "Location must not be null"); - if (logFile != null) { - logFile.applyToSystemProperties(); - } try { LoggerContext ctx = getLoggerContext(); URL url = ResourceUtils.getURL(location); 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 96e9533739..d2efce7455 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 @@ -128,9 +128,6 @@ public class LogbackLoggingSystem extends Slf4JLoggingSystem { protected void loadConfiguration(LoggingInitializationContext initializationContext, String location, LogFile logFile) { Assert.notNull(location, "Location must not be null"); - if (logFile != null) { - logFile.applyToSystemProperties(); - } LoggerContext loggerContext = getLoggerContext(); stopAndReset(loggerContext); try { 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 eabd5480e9..ce047c0e80 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2015 the original author or authors. + * Copyright 2012-2016 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. @@ -45,6 +45,7 @@ import org.springframework.context.support.GenericApplicationContext; import org.springframework.test.util.ReflectionTestUtils; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; @@ -98,6 +99,9 @@ public class LoggingApplicationListenerTests { System.clearProperty("LOG_PATH"); System.clearProperty("PID"); System.clearProperty("LOG_EXCEPTION_CONVERSION_WORD"); + System.clearProperty("CONSOLE_LOG_PATTERN"); + System.clearProperty("FILE_LOG_PATTERN"); + System.clearProperty("LOG_LEVEL_PATTERN"); System.clearProperty(LoggingSystem.SYSTEM_PROPERTY); if (this.context != null) { this.context.close(); @@ -419,6 +423,24 @@ public class LoggingApplicationListenerTests { childContext.close(); } + @Test + public void systemPropertiesAreSetForLoggingConfiguration() { + EnvironmentTestUtils.addEnvironment(this.context, + "logging.exception-conversion-word=conversion", "logging.file=file", + "logging.path=path", "logging.pattern.console=console", + "logging.pattern.file=file", "logging.pattern.level=level"); + this.initializer.initialize(this.context.getEnvironment(), + this.context.getClassLoader()); + assertThat(System.getProperty("CONSOLE_LOG_PATTERN"), is(equalTo("console"))); + assertThat(System.getProperty("FILE_LOG_PATTERN"), is(equalTo("file"))); + assertThat(System.getProperty("LOG_EXCEPTION_CONVERSION_WORD"), + is(equalTo("conversion"))); + assertThat(System.getProperty("LOG_FILE"), is(equalTo("file"))); + assertThat(System.getProperty("LOG_LEVEL_PATTERN"), is(equalTo("level"))); + assertThat(System.getProperty("LOG_PATH"), is(equalTo("path"))); + assertThat(System.getProperty("PID"), is(not(nullValue()))); + } + private boolean bridgeHandlerInstalled() { Logger rootLogger = LogManager.getLogManager().getLogger(""); Handler[] handlers = rootLogger.getHandlers();