从Maven迁移到Gradle时日志级别异常:为何Gradle输出ERROR日志?
从Maven迁移至Gradle的日志级别异常问题
问题背景
我们正从Maven迁移到Gradle,日志配置级别为INFO,但遇到两个异常现象:Gradle构建时会输出ERROR级别的日志,且finally块中的最后一条INFO日志未显示级别标记。
相关代码与日志
Java业务代码
try{ // 第22行 LOGGER.info("Process Started-----START"); ...... // 第34行 LOGGER.info("Process completed..."); } catch(Exception e) { LOGGER.error("error",e.getMessage()); } finally{ LOGGER.error("Its not error, copy past mistake"); LOGGER.info("Process completed-----END"); }
Maven构建输出日志
INFO: 2023-07-07 11:18:46.140 [main] ClassName (22)--Process Started-----START .... INFO: 2023-07-07 11:22:46.140 [main] ClassName (34)--Process completed... INFO: 2023-07-07 11:22:46.140 [main] ClassName (39)--Process completed-----END
Gradle构建输出日志
INFO: 2023-07-07 11:18:46.140 [main] ClassName (22)--Process Started-----START .... INFO: 2023-07-07 11:22:46.140 [main] ClassName (34)--Process completed... ERROR:2023-07-07 11:22:46.140 [main] ClassName (38)--Its not error, copy past mistake 2023-07-07 11:22:46.140 [main] ClassName (39)--Process completed-----END
问题分析
1. ERROR级别日志被输出的原因
日志配置的INFO级别本身允许输出INFO及更高优先级的日志(ERROR、FATAL优先级高于INFO),所以LOGGER.error()的调用本就会生成日志。Maven构建中未显示该ERROR日志,是因为Maven的日志过滤规则或依赖的日志实现(如SLF4J+Logback)配置默认屏蔽了这条日志;而Gradle环境下的日志处理逻辑没有做同样的过滤,因此输出了这条ERROR日志。
2. 最后一条INFO日志丢失级别标记的原因
这是由于Gradle自身的日志捕获与格式化机制和Maven不同:
- Gradle会统一捕获应用输出的日志,再按照自身规则重新格式化输出,可能在连续输出ERROR和INFO日志时,格式化逻辑出现异常,导致最后一条日志的级别标记丢失。
- 另外,项目依赖的日志框架与Gradle自带的日志组件可能存在版本冲突,破坏了日志的格式输出规则。
解决建议
- 统一日志配置文件:确保
src/main/resources下的日志配置文件(如logback.xml、log4j2.xml)在Gradle构建中被正确加载,配置内容与Maven环境完全一致,明确日志级别和格式规则。 - 排查日志依赖冲突:执行
./gradlew dependencies查看日志相关依赖(如slf4j、logback)的版本,若存在冲突,在build.gradle中用force指定统一版本,例如:
dependencies { implementation('org.slf4j:slf4j-api:1.7.36') { force = true } }
- 调整Gradle日志捕获规则:在
build.gradle中配置Gradle的日志捕获行为,避免修改应用日志的原始格式:
tasks.withType(JavaExec) { logging.captureStandardOutput(LogLevel.INFO) logging.captureStandardError(LogLevel.ERROR) logging.showStandardStreams = true }
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

