Python日志配置:双输出并将文件日志转为字典/JSON格式
实现Python日志双输出(控制台文本+文件JSON格式)
嘿,你已经搞定了日志同时输出到控制台和文件的基础配置,现在要让文件里的日志变成JSON/字典格式对吧?这事儿不难,我给你两种靠谱的方案:
方案一:自定义JSON格式化器(纯标准库实现)
标准库logging本身没有内置JSON格式的Formatter,但我们可以自己写一个轻量的自定义类,完全不用依赖第三方包:
首先导入json模块,然后定义继承自logging.Formatter的自定义格式化器,重写format方法把日志记录转成JSON字符串:
import logging import json from datetime import datetime class JsonFormatter(logging.Formatter): def format(self, record): # 按需构建日志字典,可添加更多字段比如模块名、行号 log_dict = { "timestamp": datetime.fromtimestamp(record.created).strftime("%a, %d %b %Y %H:%M:%S"), "level": record.levelname, "message": record.getMessage(), # 可选字段示例: # "module": record.module, # "line_number": record.lineno } return json.dumps(log_dict)
接下来修改你的日志配置,给文件处理器绑定这个JSON格式化器,控制台处理器保留原来的文本格式:
path = "app.log" # 替换成你的日志文件路径 # 配置文件处理器(JSON格式) file_handler = logging.FileHandler(path) file_handler.setFormatter(JsonFormatter()) # 配置控制台处理器(原文本格式) stream_handler = logging.StreamHandler() stream_formatter = logging.Formatter( "%(asctime)-15s %(levelname)-8s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S" ) stream_handler.setFormatter(stream_formatter) # 初始化根日志器 logging.basicConfig( level=logging.DEBUG, handlers=[file_handler, stream_handler] ) # 测试输出 logging.debug("Starting new HTTPS connection (1): google.com") logging.debug('https://google.com:443 "GET / HTT...')
这样操作后,控制台还是你熟悉的文本输出,而日志文件里的内容会是标准JSON格式:
{"timestamp": "Wed, 02 May 2018 18:43:33", "level": "DEBUG", "message": "Starting new HTTPS connection (1): google.com"} {"timestamp": "Wed, 02 May 2018 18:43:33", "level": "DEBUG", "message": "https://google.com:443 \"GET / HTT..."}
方案二:用第三方库简化开发
如果不想自己写代码,可以用成熟的第三方库python-json-logger,它提供了现成的JSON格式化器,支持更多自定义配置:
首先安装库:
pip install python-json-logger
然后修改日志配置:
import logging from pythonjsonlogger import jsonlogger path = "app.log" # 文件处理器绑定JSON格式化器 file_handler = logging.FileHandler(path) json_formatter = jsonlogger.JsonFormatter( "%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S" ) file_handler.setFormatter(json_formatter) # 控制台处理器保留原格式 stream_handler = logging.StreamHandler() stream_formatter = logging.Formatter( "%(asctime)-15s %(levelname)-8s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S" ) stream_handler.setFormatter(stream_formatter) logging.basicConfig( level=logging.DEBUG, handlers=[file_handler, stream_handler] ) # 测试 logging.debug("Starting new HTTPS connection (1): google.com")
这个库还支持自动提取日志的额外字段、格式化嵌套结构等功能,适合需要更复杂JSON日志的场景。
两种方案都能满足你的需求,看你是想纯用标准库还是用第三方库简化开发啦!
内容的提问来源于stack exchange,提问作者securisec
相关产品推荐
相关产品推荐

