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

Python logging自定义格式化失效:如何应用自定义Formatter?

解决Python logging自定义Formatter不生效及日志格式问题

问题分析

你的输出显示ERROR:root:Empty DataFrame,说明实际生效的是root logger的默认配置,而非你定义的get_data_logger。同时两个StreamHandler默认都指向sys.stderr,会导致日志流混淆,也影响systemd的输出定向规则。

修复步骤及代码

1. 明确指定StreamHandler的输出流

默认StreamHandler绑定sys.stderr,需要给stdout_handler显式指定sys.stdout,确保和systemd的输出配置对应。

2. 禁用日志传播到root logger

阻止自定义logger的日志被root logger二次处理,避免触发默认格式输出。

3. 确保使用自定义logger输出日志

代码中必须调用logger.error()、logger.info(),而非logging.error()、logging.info()(后者会直接触发root logger)。

修改后的完整代码:

import logging
import sys

# 初始化自定义logger
logger = logging.getLogger('get_data_logger')
logger.setLevel(logging.DEBUG)
# 禁用日志向root logger传播
logger.propagate = False

# 配置stdout handler(输出INFO及以上到sys.stdout)
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.INFO)

# 配置stderr handler(输出ERROR及以上到sys.stderr)
stderr_handler = logging.StreamHandler(sys.stderr)
stderr_handler.setLevel(logging.ERROR)

# 自定义格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stdout_handler.setFormatter(formatter)
stderr_handler.setFormatter(formatter)

# 添加handler到logger
logger.addHandler(stdout_handler)
logger.addHandler(stderr_handler)

# 测试输出(必须用自定义logger)
logger.info("This is an info message")
logger.error("Empty DataFrame")

验证效果

修改后,systemd的StandardOutput和StandardError会分别捕获对应流的日志,且日志格式会变为你定义的%(asctime)s - %(levelname)s - %(message)s样式,不会再出现root logger的默认格式。

内容的提问来源于stack exchange,提问作者SimD6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:27:43