diff --git a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java index 80ff09f91ee..c3db1fea70a 100644 --- a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java +++ b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedPropertyResolver.java @@ -19,7 +19,9 @@ package org.springframework.boot.bind; import java.util.Map; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; import org.springframework.core.env.PropertyResolver; +import org.springframework.core.env.PropertySourcesPropertyResolver; import org.springframework.util.Assert; /** @@ -145,4 +147,25 @@ public class RelaxedPropertyResolver implements PropertyResolver { keyPrefix); } + /** + * Return a property resolver for the environment, preferring one that ignores + * unresolvable nested placeholders. + * @param environment the source environment + * @param prefix the prefix + * @return a property resolver for the environment + * @since 1.4.3 + */ + public static RelaxedPropertyResolver ignoringUnresolvableNestedPlaceholders( + Environment environment, String prefix) { + Assert.notNull(environment, "Environment must not be null"); + PropertyResolver resolver = environment; + if (environment instanceof ConfigurableEnvironment) { + resolver = new PropertySourcesPropertyResolver( + ((ConfigurableEnvironment) environment).getPropertySources()); + ((PropertySourcesPropertyResolver) resolver) + .setIgnoreUnresolvableNestedPlaceholders(true); + } + return new RelaxedPropertyResolver(resolver, prefix); + } + } 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 14337f2037c..91855cf44d0 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 @@ -49,8 +49,8 @@ class LoggingSystemProperties { } public void apply(LogFile logFile) { - RelaxedPropertyResolver propertyResolver = new RelaxedPropertyResolver( - this.environment, "logging."); + RelaxedPropertyResolver propertyResolver = RelaxedPropertyResolver + .ignoringUnresolvableNestedPlaceholders(this.environment, "logging."); setSystemProperty(propertyResolver, EXCEPTION_CONVERSION_WORD, "exception-conversion-word"); setSystemProperty(propertyResolver, CONSOLE_LOG_PATTERN, "pattern.console"); diff --git a/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java b/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java index d6c4921154d..d10bd1f0dcb 100644 --- a/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java +++ b/spring-boot/src/main/java/org/springframework/boot/logging/logback/DefaultLogbackConfiguration.java @@ -72,7 +72,8 @@ class DefaultLogbackConfiguration { if (environment == null) { return new PropertySourcesPropertyResolver(null); } - return new RelaxedPropertyResolver(environment, "logging.pattern."); + return RelaxedPropertyResolver.ignoringUnresolvableNestedPlaceholders(environment, + "logging.pattern."); } public void apply(LogbackConfigurator config) { 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 92536c1f271..a6ac5e7d51c 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 @@ -467,6 +467,16 @@ public class LoggingApplicationListenerTests { assertThat(System.getProperty("PID")).isNotNull(); } + @Test + public void environmentPropertiesIgnoreUnresolvablePlaceholders() { + // gh-7719 + TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context, + "logging.pattern.console=console ${pid}"); + this.initializer.initialize(this.context.getEnvironment(), + this.context.getClassLoader()); + assertThat(System.getProperty("CONSOLE_LOG_PATTERN")).isEqualTo("console ${pid}"); + } + @Test public void logFilePropertiesCanReferenceSystemProperties() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,