Flink1.12环境下Spring Boot启动Bean创建日志未输出至日志文件问题排查
问题根因说明
Flink 1.9与1.12.1版本的日志体系存在底层架构差异,是升级后Spring Boot启动阶段日志无法写入指定文件的核心原因,具体差异包括:
- 框架日志实现切换:Flink 1.9默认采用Log4j1作为日志框架,1.12.1正式切换为Log4j2,全局日志路由规则完全重构
- 桥接依赖缺失:1.12.1的官方发行包默认移除了Logback/Slf4j到Log4j2的桥接能力,Spring Boot原生打印的Logback日志事件无法被Flink的Log4j2上下文捕获
- 默认日志级别拦截:1.12.1的默认cli日志配置中,对
org.springframework、org.springframework.boot等Spring核心包路径默认设置了WARN级别过滤,INFO级别的Bean创建、启动流程日志会被直接丢弃 - 类加载隔离:默认的
child-first类加载策略,会让Spring Boot优先加载作业包内置的Logback日志实现,与Flink集群的日志配置完全隔离,日志路由根本不会触达集群配置的文件appender
对齐旧版本日志效果的配置步骤
- 补齐日志桥接依赖
在作业的Maven依赖中排除Spring Boot自带的logback-classic冲突依赖,补充引入适配Log4j2的桥接组件log4j-slf4j-impl,依赖scope设置为provided,避免与Flink集群自带的日志依赖产生类冲突,确保Spring Boot打印的日志事件可以被Flink的Log4j2上下文统一捕获。 - 调整日志配置的级别规则
在使用的flink1.12_log4j-cli.properties配置中,显式添加Spring相关包路径的日志级别配置,与1.9版本的过滤规则保持一致:- 配置
logger.springframework.name=org.springframework - 配置
logger.springframework.level=INFO - 保持该logger的additivity属性为开启状态,让日志可以透传到根配置对应的滚动文件appender,不会被本地配置拦截。
- 配置
- 修正类加载策略
提交作业时添加启动参数-Dclassloader.resolve-order=parent-first,或在集群配置中把org.slf4j、ch.qos.logback、org.apache.logging这类日志框架相关的类,加入父类加载器优先加载的列表,避免作业内置的Logback配置绕过Flink的日志路由逻辑。 - 关闭全局日志拦截开关
检查flink-conf.yaml的全局日志参数,确认没有开启logger.disable.slf4j、logger.disable.jul这类会拦截第三方日志事件的配置,确保桥接后的日志事件不会被全局规则阻断。
配置生效校验方法
- 提交作业后检查控制台输出的日志框架标识,确认当前日志上下文为Log4j2而非作业内置的Logback
- 验证指定日志文件中可正常输出Spring Boot启动Banner,即代表日志路由链路打通,后续的Bean创建、启动流程的INFO级别日志会按照1.9版本的规则正常落盘
内容的提问来源于stack exchange,提问作者Abhishek Shukla
相关产品推荐
相关产品推荐

