Python logging库使用simpleFormatter如何保留日志中的双引号与反斜杠?
解决方案
你遇到的问题本质是直接用字符串模板拼接JSON时不会自动转义特殊字符,最终会生成非法JSON格式,以下是两种可行方案:
方案1:自定义Formatter(无额外依赖,自由度最高)
直接继承Python logging的Formatter类,通过json模块序列化日志内容,自动处理所有转义字符,同时可随意自定义输出字段:
- 首先实现自定义格式化类:
import json import logging class CustomJsonFormatter(logging.Formatter): def format(self, record): # 按需添加所需字段即可,无需修改其他配置 log_item = { "@timestamp": self.formatTime(record, datefmt=self.datefmt), "message": record.getMessage() # 如需添加其他字段直接补在字典里即可,例如: # "level": record.levelname, # "lineno": record.lineno } return json.dumps(log_item, ensure_ascii=False)
- 修改config.ini中formatter的配置,替换原有simpleFormatter配置:
[formatter_simpleFormatter] class=你存放上述类的文件名.CustomJsonFormatter datefmt=%Y-%m-%d %H:%M:%S,%f propagate=False
- 加载logging配置前提前导入sys和你实现的CustomJsonFormatter类即可,原有日志打印逻辑无需任何修改。
方案2:使用支持自定义字段的第三方JSON日志库
如果不想自己实现格式化逻辑,可以使用python-json-logger库,该库支持通过配置指定输出的字段列表,完全满足你仅输出少量自定义字段的需求,同时内置自动转义特殊字符的能力。
原有方案不生效的原因
你之前尝试使用%(message)r不生效是因为%r对应的repr输出会给字符串外层额外包裹引号,最终输出的JSON结构会不符合预期,不是正确的转义方案。
内容的提问来源于stack exchange,提问作者prathyusha
相关产品推荐
相关产品推荐

