Spring Boot中@Slf4j日志行为在测试与正式应用中不一致问题
问题解答
1. 测试与正式应用日志行为差异的原因
- Spring Boot正式启动时,会自动加载内置的默认日志配置,默认将根日志级别设为 INFO,因此DEBUG及更低级别的日志不会输出,和你在正式应用中看到的输出结果一致。
- 你编写的JUnit测试是普通单元测试,未添加Spring Boot测试相关注解,运行时不会初始化Spring上下文,因此不会加载Spring Boot的默认日志配置,会直接使用日志实现框架(Spring Boot默认使用Logback)的原生默认配置,Logback原生默认的根日志级别为 DEBUG,所以测试环境会输出DEBUG级别的日志。
2. JUnit4环境下对齐正式环境日志行为的解决方案
首先纠正常见误解:@SpringBootTest本身支持JUnit4,只需搭配JUnit4对应的运行器注解即可使用,不需要切换到JUnit5,具体可选方案如下:
方案1:使用Spring Boot测试注解启动上下文(最推荐,完全对齐正式环境行为)
在测试类上补充两个注解即可:
import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class TestLoggingTest { // 原有测试代码无需修改 TestLogging testLogging = new TestLogging(); @Test public void testLoggingLevel(){ testLogging.printLogLevel(); } }
@RunWith(SpringRunner.class)是Spring针对JUnit4提供的测试运行器,会触发Spring上下文的初始化流程,自动加载和正式环境完全一致的日志配置,日志级别自然会和正式应用对齐。
方案2:手动配置测试环境日志文件(无需启动Spring上下文)
如果你的测试不需要启动Spring上下文,只想让日志级别和正式环境一致,可以在src/test/resources目录下添加配置文件:
- 方式A:添加
application.properties配置日志级别:
logging.level.root=INFO
- 方式B:添加
logback-test.xml(Logback会优先加载test目录下的该配置文件),可以自定义日志级别、输出格式,和正式环境的日志配置完全对齐。
方案3:测试运行时手动修改日志级别
如果只想临时调整单个测试的日志级别,可以在测试方法执行前手动修改Logger的级别:
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import org.slf4j.LoggerFactory; import org.junit.Before; public class TestLoggingTest { TestLogging testLogging = new TestLogging(); @Before public void setLogLevel() { Logger targetLogger = (Logger) LoggerFactory.getLogger("com.tejas.springlogging"); targetLogger.setLevel(Level.INFO); } @Test public void testLoggingLevel(){ testLogging.printLogLevel(); } }
内容的提问来源于stack exchange,提问作者tejas madappa
相关产品推荐
相关产品推荐

