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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:26