为何K8s Java容器的JSON日志在Google Cloud Logging中被引号包裹
Kubernetes Java容器GCP日志被双引号包裹成因分析
- Java日志框架重复序列化问题:你的Java应用大概率在日志输出逻辑中做了两次JSON序列化操作:首先将日志字段拼接为符合GCP格式的JSON字符串,后续又被日志框架(如Logback/Log4j2)的控制台输出器当作普通文本做了第二层转义输出。比如原始生成的JSON为
{"message":"xxx","severity":"INFO"},转义后输出到stdout的内容就会变成"{\"message\":\"xxx\",\"severity\":\"INFO\"}",GCP日志代理采集后就会在Logs Explorer中显示外层的双引号。
你可以直接执行kubectl logs <Pod名称>查看容器原始输出,如果原始输出就已经带有外层双引号,就可以确认是应用侧日志框架配置问题。 - 容器运行时输出转义问题:检查Java容器的ENTRYPOINT/CMD启动配置,确认是否存在shell二次处理日志输出的逻辑,比如通过
echo、print这类命令中转输出应用日志,部分shell环境会对输入的JSON字符串自动做转义包装,额外添加外层双引号。其他无异常的容器如果是直接让应用进程接管stdout输出,就不会出现该问题。 - GKE日志采集规则不匹配问题:如果你使用的是GKE托管集群,需要检查Pod是否添加了
logging.gke.io/json: "true"标注,未配置该标注时,GCP日志代理会默认将所有stdout输出识别为普通文本,哪怕内容是合法JSON格式也会被当作字符串做一层包装,最终显示时就会出现外层双引号。其他容器如果已经配置了对应的JSON采集标注,就能被正确解析不会出现包裹现象。
内容的提问来源于stack exchange,提问作者Jodiug
相关产品推荐
相关产品推荐

