From 222a09cfd37f9be3d4675981b8113660af7f6564 Mon Sep 17 00:00:00 2001 From: Madhura Bhave Date: Thu, 6 Jul 2017 14:25:30 -0700 Subject: [PATCH] Make ROOT logger name case-insensitive when setting log level Fixes gh-9693 --- .../boot/logging/LoggingApplicationListener.java | 14 ++++++++++---- .../logging/LoggingApplicationListenerTests.java | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 4 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 5553b58b9c..215ce64df2 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 @@ -341,17 +341,23 @@ public class LoggingApplicationListener implements GenericApplicationListener { protected void setLogLevels(LoggingSystem system, Environment environment) { Map levels = new RelaxedPropertyResolver(environment) .getSubProperties("logging.level."); + boolean rootProcessed = false; for (Entry entry : levels.entrySet()) { - setLogLevel(system, environment, entry.getKey(), entry.getValue().toString()); + String name = entry.getKey(); + if (name.equalsIgnoreCase(LoggingSystem.ROOT_LOGGER_NAME)) { + if (rootProcessed) { + return; + } + name = null; + rootProcessed = true; + } + setLogLevel(system, environment, name, entry.getValue().toString()); } } private void setLogLevel(LoggingSystem system, Environment environment, String name, String level) { try { - if (name.equalsIgnoreCase(LoggingSystem.ROOT_LOGGER_NAME)) { - name = null; - } level = environment.resolvePlaceholders(level); system.setLogLevel(name, coerceLogLevel(level)); } 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 64561e9155..016b52eba1 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 @@ -18,6 +18,7 @@ package org.springframework.boot.logging; import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -47,6 +48,8 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.SimpleApplicationEventMulticaster; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; import org.springframework.test.context.support.TestPropertySourceUtils; import org.springframework.test.util.ReflectionTestUtils; @@ -481,6 +484,17 @@ public class LoggingApplicationListenerTests { assertThat(System.getProperty("CONSOLE_LOG_PATTERN")).isEqualTo("console ${pid}"); } + @Test + public void lowPriorityPropertySourceShouldNotOverrideRootLoggerConfig() throws Exception { + MutablePropertySources propertySources = this.context.getEnvironment().getPropertySources(); + propertySources.addFirst(new MapPropertySource("test1", Collections.singletonMap("logging.level.ROOT", "DEBUG"))); + propertySources.addLast(new MapPropertySource("test2", Collections.singletonMap("logging.level.root", "WARN"))); + this.initializer.initialize(this.context.getEnvironment(), + this.context.getClassLoader()); + this.logger.debug("testatdebug"); + assertThat(this.outputCapture.toString()).contains("testatdebug"); + } + @Test public void logFilePropertiesCanReferenceSystemProperties() { TestPropertySourceUtils.addInlinedPropertiesToEnvironment(this.context,