OpenShift OKD 3.11中Quarkus JSON日志输出异常问题咨询
问题分析与解决方案
咱们直接针对你的问题逐一拆解,给出可落地的解决办法:
1. 这是OpenShift OKD 3.11的默认行为吗?
不是。OKD本身不会主动修改应用的日志格式,问题出在你的应用运行环境(基础镜像)与Quarkus日志配置的适配性上。本地quarkus:dev模式下,Quarkus会自动加载适配的日志管理配置;但部署到OKD时,基础镜像的默认日志设置覆盖了Quarkus的配置,才导致格式异常。
2. 是否与基础镜像有关?
绝对有关。你使用的fabric8/s2i-java镜像默认采用Java原生的java.util.logging日志管理器,而Quarkus的quarkus-logging-json依赖是基于JBoss Log Manager实现的。当运行环境未指定使用JBoss Log Manager时,Quarkus的JSON日志格式无法生效,MDC值也会丢失。
3. 能否调整该行为?怎么调整?
当然可以,以下是具体修复步骤:
步骤1:强制开启Quarkus JSON日志配置
在项目src/main/resources/application.properties中添加以下配置,明确开启JSON格式并强制包含MDC:
# 开启控制台JSON日志输出 quarkus.log.console.json=true # 强制在JSON日志中携带MDC内容 quarkus.log.mdc.included=true # 可选:统一日志时间格式(和本地保持一致) quarkus.log.console.json.time-format=yyyy-MM-dd'T'HH:mm:ss.SSSXXX
步骤2:指定运行时使用JBoss Log Manager
Quarkus的日志功能依赖JBoss Log Manager,你需要在OKD部署配置中添加启动参数,确保JVM加载该管理器:
- 方法A:通过命令行设置环境变量
oc set env dc/你的部署名称 JAVA_OPTS="-Djava.util.logging.manager=org.jboss.logmanager.LogManager" - 方法B:自定义S2I启动脚本
在项目根目录创建.s2i/bin/run脚本,手动指定启动参数:
记得给脚本添加执行权限:#!/bin/bash exec java -Djava.util.logging.manager=org.jboss.logmanager.LogManager -jar $JAVA_APP_DIR/$JAVA_APP_JAR $JAVA_OPTSchmod +x .s2i/bin/run,之后重新构建镜像即可。
步骤3:(推荐)替换为Quarkus官方基础镜像
fabric8/s2i-java并非为Quarkus优化的镜像,替换成Quarkus官方JVM镜像能省去大量配置麻烦。针对Java 8的镜像为:quay.io/quarkus/quarkus-jvm-8:1.8.1.Final。
修改BuildConfig使用该镜像后,官方镜像会自动预设正确的日志管理器和Quarkus适配配置,JSON日志直接生效。
4. 其他确保JSON日志输出的方法
- 验证本地构建产物:在本地构建可运行Jar后,用
java -Djava.util.logging.manager=org.jboss.logmanager.LogManager -jar 你的应用.jar测试,确认日志为JSON格式后再部署,排除构建过程的问题。 - 避免日志框架冲突:如果项目引入了其他日志框架(如Logback),确保其与Quarkus的JBoss Logging兼容,优先使用Quarkus提供的日志组件。
内容的提问来源于stack exchange,提问作者Frank Rakhorst

