Python如何将标准字符串日志转换为仅输出JSON键值对结构化日志
解决Python日志同时输出标准字符串和JSON格式问题的方案
1. 核心原因
出现双份日志的核心原因是日志系统存在多个输出处理器:一个是你配置的JSON格式处理器,另一个是logging模块默认生成的、输出标准字符串格式的根处理器,且未关闭日志向上传播的开关。
2. 具体调整步骤
- 首先安装JSON日志格式化依赖库:
pip install python-json-logger - 清空默认根处理器,仅保留JSON格式处理器:
import logging from pythonjsonlogger import jsonlogger # 移除根logger所有默认处理器,避免默认输出普通格式日志 for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) # 初始化仅输出JSON的处理器 json_handler = logging.StreamHandler() # 自定义需要输出的键值对字段 json_formatter = jsonlogger.JsonFormatter( "%(asctime)s %(levelname)s %(name)s %(message)s" ) json_handler.setFormatter(json_formatter) # 配置业务logger logger = logging.getLogger("splunk_logger") logger.addHandler(json_handler) logger.setLevel(logging.INFO) # 关闭日志向上传播,避免日志传递到父级logger触发额外输出 logger.propagate = False - 测试输出:
logger.info("用户登录", extra={"user_id": 123, "ip": "192.168.1.1"}) # 仅输出JSON格式日志:{"asctime": "2024-05-22 14:30:00,123", "levelname": "INFO", "name": "splunk_logger", "message": "用户登录", "user_id": 123, "ip": "192.168.1.1"}
注意:不要给当前logger添加多个不同格式的处理器,所有自定义字段都可以通过
extra参数传入,会自动转换为JSON的键值对,完全适配Splunk的日志检索需求。
内容的提问来源于stack exchange,提问作者Sarvendra Singh
相关产品推荐
相关产品推荐

