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
相关产品推荐
相关产品推荐

