Spring Boot 1.5.x升级至2.4.4后单元测试debug日志异常输出求助
Spring Boot 2.4.4 单元测试Debug日志问题解决方案
根因说明
Spring Boot 2.4+版本调整了测试场景下的配置加载优先级,主资源目录下的application.properties、logback-spring.xml默认优先级低于测试环境的隐式配置,且JUnit Vintage、Spring Test模块的日志默认绑定根日志级别,仅设置org.springframework.test包的级别无法覆盖所有Debug日志输出源。
可落地解决方案
按优先级从高到低尝试以下方案即可解决:
方案1:使用测试专属Profile配置
- 在
src/test/resources目录下新建application-test.properties,添加以下配置:
# 全局根日志级别 logging.level.root=INFO # 覆盖Spring测试模块日志级别 logging.level.org.springframework.test=INFO # 覆盖JUnit Vintage引擎日志级别 logging.level.org.junit.vintage=INFO logging.level.org.junit.platform=INFO # 覆盖Spring框架通用日志级别 logging.level.org.springframework=INFO
- 所有单元测试类添加
@ActiveProfiles("test")注解,强制加载测试专属配置,避免主配置被测试环境默认配置覆盖。
方案2:使用测试专属Logback配置
直接在src/test/resources目录下新建logback-test.xml,该配置优先级高于主资源目录下的所有logback配置,测试阶段会优先加载,示例配置如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 单独配置测试相关模块日志级别 --> <logger name="org.springframework.test" level="INFO" additivity="false"> <appender-ref ref="CONSOLE" /> </logger> <logger name="org.junit.vintage" level="INFO" additivity="false"> <appender-ref ref="CONSOLE" /> </logger> <logger name="org.junit.platform" level="INFO" additivity="false"> <appender-ref ref="CONSOLE" /> </logger> <logger name="org.springframework" level="INFO" /> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
方案3:构建工具执行测试时指定日志级别
如果是Maven/Gradle构建执行测试时输出Debug日志,可以直接在构建配置中指定系统属性强制覆盖日志级别:
- Maven(pom.xml中添加):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <systemPropertyVariables> <logging.level.root>INFO</logging.level.root> <logging.level.org.springframework.test>INFO</logging.level> <logging.level.org.junit.vintage>INFO</logging.level> </systemPropertyVariables> </configuration> </plugin>
- Gradle(build.gradle中添加):
test { systemProperty 'logging.level.root', 'INFO' systemProperty 'logging.level.org.springframework.test', 'INFO' systemProperty 'logging.level.org.junit.vintage', 'INFO' }
方案4:排查日志依赖冲突
如果以上方案均不生效,使用对应构建命令排查是否存在多余的日志实现依赖,冲突会导致日志配置不生效:
- Maven执行命令:
mvn dependency:tree - Gradle执行命令:
gradle dependencies
排查是否存在log4j、commons-logging等非slf4j绑定的日志实现包,找到后在对应依赖中用<exclusion>标签(Maven)或exclude语法(Gradle)排除即可。
内容的提问来源于stack exchange,提问作者Arpita Sheelavant
相关产品推荐
相关产品推荐

