From 5cf2e763778098032bf94bc510949f1620d86f3f Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 23 Nov 2017 12:26:53 +0000 Subject: [PATCH] Set PID system property before *_LOG_PATTERN system properties Previously, the PID system property was set after the CONSOLE_LOG_PATTERN and FILE_LOG_PATTERN system properties. This meant that the values of the pattern system properties could not reference the PID system property, i.e. ${PID} would not resolve. This commit sets the PID system property before the *_LOG_PATTERN system properties, thereby allowing the latter to reference the former. Closes gh-10594 --- .../boot/logging/LoggingSystemProperties.java | 2 +- .../logging/LoggingSystemPropertiesTests.java | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 spring-boot/src/test/java/org/springframework/boot/logging/LoggingSystemPropertiesTests.java diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java index 4ad47f0816..acaf468947 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/LoggingSystemProperties.java @@ -53,10 +53,10 @@ class LoggingSystemProperties { .ignoringUnresolvableNestedPlaceholders(this.environment, "logging."); setSystemProperty(propertyResolver, EXCEPTION_CONVERSION_WORD, "exception-conversion-word"); + setSystemProperty(PID_KEY, new ApplicationPid().toString()); 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(); } diff --git a/spring-boot/src/test/java/org/springframework/boot/logging/LoggingSystemPropertiesTests.java b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingSystemPropertiesTests.java new file mode 100644 index 0000000000..e5ae212639 --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/logging/LoggingSystemPropertiesTests.java @@ -0,0 +1,98 @@ +/* + * Copyright 2012-2017 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; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import org.springframework.core.env.Environment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.StandardEnvironment; +import org.springframework.mock.env.MockEnvironment; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link LoggingSystemProperties}. + * + * @author Andy Wilkinson + */ +public class LoggingSystemPropertiesTests { + + private Set systemPropertyNames; + + @Before + public void captureSystemPropertyNames() { + this.systemPropertyNames = new HashSet(System.getProperties().keySet()); + } + + @After + public void restoreSystemProperties() { + System.getProperties().keySet().retainAll(this.systemPropertyNames); + } + + @Test + public void pidIsSet() { + new LoggingSystemProperties(new MockEnvironment()).apply(null); + assertThat(System.getProperty(LoggingSystemProperties.PID_KEY)).isNotNull(); + } + + @Test + public void consoleLogPatternIsSet() { + new LoggingSystemProperties(new MockEnvironment() + .withProperty("logging.pattern.console", "console pattern")).apply(null); + assertThat(System.getProperty(LoggingSystemProperties.CONSOLE_LOG_PATTERN)) + .isEqualTo("console pattern"); + } + + @Test + public void fileLogPatternIsSet() { + new LoggingSystemProperties(new MockEnvironment() + .withProperty("logging.pattern.file", "file pattern")).apply(null); + assertThat(System.getProperty(LoggingSystemProperties.FILE_LOG_PATTERN)) + .isEqualTo("file pattern"); + } + + @Test + public void consoleLogPatternCanReferencePid() { + new LoggingSystemProperties( + environment("logging.pattern.console", "${PID:unknown}")).apply(null); + assertThat(System.getProperty(LoggingSystemProperties.CONSOLE_LOG_PATTERN)) + .matches("[0-9]+"); + } + + @Test + public void fileLogPatternCanReferencePid() { + new LoggingSystemProperties(environment("logging.pattern.file", "${PID:unknown}")) + .apply(null); + assertThat(System.getProperty(LoggingSystemProperties.FILE_LOG_PATTERN)) + .matches("[0-9]+"); + } + + private Environment environment(String key, Object value) { + StandardEnvironment environment = new StandardEnvironment(); + environment.getPropertySources().addLast( + new MapPropertySource("test", Collections.singletonMap(key, value))); + return environment; + } + +}