如何在不构建自定义镜像的前提下为Ververica Flink开启JSON日志
Ververica平台无自定义镜像开启JSON日志方案
结论
不构建自定义镜像完全可以实现Ververica环境下的Flink JSON日志输出,你之前的尝试遗漏了两项核心配置逻辑。
问题原因分析
你遇到的两个报错分别对应两个已知限制:
- 制品上传的依赖仅会被用户作业的类加载器加载,而Flink的日志框架在集群进程启动阶段就完成初始化,此时作业类加载器还未加载,因此制品中的jackson依赖无法被日志框架识别
- Ververica官方发行版的log4j2依赖包未内置
EcsLayout.json、LogstashJsonEventLayoutV1.json这类预置模板,因此直接指定类路径模板会抛出文件不存在异常
无自定义镜像实现方案
方案1:使用内嵌模板的JsonTemplateLayout(推荐,无额外依赖)
JsonTemplateLayout本身是log4j2-core原生自带的组件,不需要额外引入jackson依赖,你可以直接通过eventTemplateString参数把JSON模板内嵌到日志配置中,无需依赖类路径下的模板文件。
你可以把原有RollingFile追加器的Layout配置替换为以下内容即可生效:
<JsonTemplateLayout eventTemplateString="{ "timestamp": "$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}", "log_level": "$${level}", "logger_name": "$${logger}", "thread_name": "$${thread}", "message": "$${message}", "exception_stack": "$${exception:full}", "mdc": $${mdc} }"/>
你可以根据业务需要自行增减模板中的字段,所有log4j2内置的变量都可以直接在模板中使用。
方案2:使用JSONLayout(需额外下载依赖)
如果你坚持要使用JSONLayout,不需要构建镜像,可以通过配置init容器在Flink进程启动前提前下载jackson相关依赖到Flink的lib目录。
在Ververica平台的作业高级配置或者集群模板的高级参数中添加如下配置即可:
flink.kubernetes.pod.spec: | initContainers: - name: preload-jackson image: busybox:stable command: - wget - -P - /opt/flink/lib - [你的私有仓库地址/jackson-databind-2.15.4.jar] - [你的私有仓库地址/jackson-core-2.15.4.jar] - [你的私有仓库地址/jackson-annotations-2.15.4.jar] volumeMounts: - name: flink-lib-dir mountPath: /opt/flink/lib
配置完成后重启集群/作业,init容器会在Flink进程启动前完成依赖下载,日志框架就可以正常加载jackson依赖使用JSONLayout。
内容的提问来源于stack exchange,提问作者OranShuster
相关产品推荐
相关产品推荐

