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
相关产品推荐
相关产品推荐

