You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何配置Cloud Logging使jsonPayload直接展示自定义JSON结构

问题原因

你当前的写法是将字典序列化为JSON字符串后作为普通日志消息传入日志方法,CloudLoggingHandler默认会将普通字符串消息放在jsonPayload.message字段中,因此会出现转义后的字符串嵌套的情况。

解决方案

方案1:自定义Formatter适配结构化日志输出

这是扩展性最高的方案,通过自定义Formatter直接返回字典结构,CloudLoggingHandler会自动将该字典作为jsonPayload的完整内容:

import logging
import google.cloud.logging
from google.cloud.logging.handlers import CloudLoggingHandler

# 自定义Formatter,直接返回结构化字典
class StructuredFormatter(logging.Formatter):
    def format(self, record):
        # 直接返回日志内容中的字典结构,无需序列化
        return record.msg

# 初始化日志配置
client = google.cloud.logging.Client()
handler = CloudLoggingHandler(client, name="test")
# 绑定自定义Formatter
handler.setFormatter(StructuredFormatter())

cloud_logger = logging.getLogger('cloudLogger')
# 修正笔误:原代码setLvel拼写错误
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(handler)

# 直接传入字典,不要做json.dumps序列化
cloud_logger.info({"test": "testing"})

方案2:使用extra参数直接传递结构化字段

如果不想自定义Formatter,也可以通过日志方法的extra参数传入json_fields字段,CloudLoggingHandler会自动解析该字段的内容为jsonPayload结构,不需要额外配置Formatter:

# 沿用你原有的初始化配置,不需要修改Formatter
client = google.cloud.logging.Client()
handler = CloudLoggingHandler(client, name="test")
cloud_logger = logging.getLogger('cloudLogger')
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(handler)

# 打日志时通过extra传递json_fields
cloud_logger.info(
    "", # 留空message字段,不会出现在最终的jsonPayload中
    extra={"json_fields": {"test": "testing"}}
)

注意事项

  • 无需自行对要输出的字典执行json.dumps序列化,直接传递Python原生字典即可,序列化操作由日志Handler内部完成
  • 你提供的示例代码存在两处笔误:setLvel应为setLevel,cloud_logger.info调用末尾缺少右括号,调试前需要先修正这两个问题。

内容的提问来源于stack exchange,提问作者Expert wanna be

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:54:03