如何禁用Spring Boot测试中ApplicationContextRunner的日志?logging.level.root=warn无效
Spring Boot Starter测试中ApplicationContextRunner日志级别不生效的解决办法
问题根源
- 默认上下文不加载Spring Boot日志配置:ApplicationContextRunner默认使用Spring Framework的
AnnotationConfigApplicationContext,这个基础上下文不会自动加载Spring Boot的LoggingAutoConfiguration,所以通过withPropertyValues设置的logging.level.root=warn根本不会被日志系统识别。 - 早期日志不受配置管控:上下文初始化阶段(比如refresh过程)的Debug日志,是在Spring Boot日志配置生效前就输出的,就算后续加载了日志配置,这些早一步输出的日志也不受控制。
解决办法
办法1:加载日志自动配置让Spring Boot管理日志
修改测试代码,添加.withConfiguration(AutoConfigurations.of(LoggingAutoConfiguration.class)),让Spring Boot的日志自动配置生效,这样测试执行阶段的日志就会遵循你设置的WARN级别:
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.junit.jupiter.api.Test; @Test void someTest() { new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(LoggingAutoConfiguration.class)) .withPropertyValues("logging.level.root=warn") .run(context -> { assertNull(context.getStartupFailure()); // 这里的代码输出日志会按WARN级别过滤 }); }
注意:上下文初始化的早期Debug日志还是会存在,因为这些日志在自动配置生效前就打出来了。
办法2:直接控制Spring核心类的日志级别
如果要彻底干掉这些早期Debug日志,有两种方式:
- 测试类静态代码块提前设置:在测试类里加个静态代码块,在上下文启动前就把Spring核心类的日志级别改成WARN:
import org.slf4j.LoggerFactory; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; public class YourStarterTest { static { // 调整Spring上下文和Bean工厂的日志级别 Logger contextLogger = (Logger) LoggerFactory.getLogger(org.springframework.context.annotation.AnnotationConfigApplicationContext.class); contextLogger.setLevel(Level.WARN); Logger beanFactoryLogger = (Logger) LoggerFactory.getLogger(org.springframework.beans.factory.support.DefaultListableBeanFactory.class); beanFactoryLogger.setLevel(Level.WARN); } @Test void someTest() { new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(LoggingAutoConfiguration.class)) .withPropertyValues("logging.level.root=warn") .run(context -> { assertNull(context.getStartupFailure()); }); } }
- Gradle全局配置测试JVM参数:在
build.gradle里给测试任务加JVM参数,全局控制这些类的日志级别:
test { jvmArgs = [ "-Dlogging.level.org.springframework.context=WARN", "-Dlogging.level.org.springframework.beans.factory=WARN" ] }
办法3:用SpringBootApplicationContextRunner(推荐)
如果你的Spring Boot版本是2.4及以上,直接用SpringBootApplicationContextRunner,它默认会加载Spring Boot的自动配置,更贴合实际应用环境,日志配置也会自动生效:
import org.springframework.boot.test.context.runner.SpringBootApplicationContextRunner; import org.junit.jupiter.api.Test; @Test void someTest() { new SpringBootApplicationContextRunner() .withPropertyValues("logging.level.root=warn") .run(context -> { assertNull(context.getStartupFailure()); }); }
这个方式下,测试阶段的日志会严格遵循WARN级别,早期日志也会被大幅减少。
验证
改完之后运行测试,就能看到:
- 你自己代码里的日志只会输出WARN及以上级别
- 那些Spring上下文初始化的Debug日志要么消失,要么变成WARN级别
内容的提问来源于stack exchange,提问作者ETLJ
相关产品推荐
相关产品推荐

