Spring Boot集成Spark后日志输出XML、生成.lck文件问题排查
问题根因
出现application.logs.0、application.logs.0.lck文件+XML格式日志,是Log4j 1.x 日志实现抢占了SLF4J绑定位置,替代Spring Boot默认的Logback日志系统生效导致的。Spark生态的组件默认会传递引入Log4j 1.x的依赖包,未做适配的情况下会和Spring Boot默认日志体系产生冲突。
问题定位步骤
- 执行Maven依赖过滤命令,直接定位冲突源,无需逐行翻全量依赖树:
mvn dependency:tree -Dincludes=org.slf4j:*,log4j:*,org.apache.logging.log4j:*,ch.qos.logback:* - 查看命令输出结果,找到
log4j:log4j、org.slf4j:slf4j-log4j12两个依赖的引入路径,这两个包就是触发冲突的直接来源,对应的上游依赖就是你引入的Spark相关组件。
解决方案
- 排除Spark依赖中传递的Log4j 1.x实现
在所有Spark相关依赖(包括spark-core、spark-sql、spark-streaming等所有你显式引入的Spark组件)的配置中添加排除规则,以spark-core为例:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>对应你使用的Spark版本</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
- 验证排除结果
重新执行之前的依赖过滤命令,确认类路径下已经不存在log4j:log4j、org.slf4j:slf4j-log4j12两个包,剩余日志相关依赖应为Spring Boot默认的日志体系组件:
ch.qos.logback:logback-classicch.qos.logback:logback-coreorg.slf4j:slf4j-apiorg.apache.logging.log4j:log4j-to-slf4j(该包为Spring Boot自带的Log4j2日志桥接组件,属于正常依赖无需处理)
- 补全日志桥接包(可选)
如果排除依赖后启动提示找不到Log4j相关类,添加Log4j到SLF4J的桥接包即可,不要引入真实的Log4j实现包:
<dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <scope>runtime</scope> </dependency>
- 重启应用验证
清理之前生成的异常日志文件后重启应用,会正常生成名为application.logs的普通文本日志文件,不会再生成带.0、.lck后缀的异常文件。
内容的提问来源于stack exchange,提问作者Marcin_S
相关产品推荐
相关产品推荐

