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

Python日志问题:INFO级日志未写入文件,ERROR日志重复输出

Python日志初始化问题的错误分析与修正

问题根源

你遇到的两个问题,本质是日志系统的级别过滤逻辑和处理器规则没设置正确:

  1. 仅ERROR级日志写入文件:默认情况下,logger的级别是logging.WARNING,会直接过滤掉INFO级别的日志,导致INFO处理器根本接收不到日志内容。
  2. ERROR级日志同时出现在两个文件:INFO级别包含所有比它高的级别(ERROR、CRITICAL),所以设置了level=INFO的处理器会自动处理ERROR日志,没有做级别范围限制。

关键修正步骤

1. 降低logger的全局级别

必须把logger的级别设置为logging.INFO(或更低的DEBUG),确保INFO及以上的日志能进入后续处理器环节。

2. 给INFO处理器添加级别过滤器

自定义一个过滤器,让INFO处理器只处理纯INFO级别的日志,排除ERROR及以上的日志。

3. 关闭日志传播(可选但推荐)

设置logger.propagate = False,避免日志向上传播到根logger,防止重复输出。

修正后的示例代码

import logging
from logging.handlers import RotatingFileHandler

# 自定义过滤器:只保留INFO级别日志
class InfoFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.INFO

def initLogger(info_file=None, error_file=None, log_to_console=False):
    logger = logging.getLogger("custom_logger")
    # 清空已有处理器,避免重复初始化导致的重复输出
    logger.handlers.clear()
    # 设置logger级别为INFO,确保INFO及以上日志能被处理
    logger.setLevel(logging.INFO)
    # 关闭日志传播到根logger
    logger.propagate = False

    # 配置INFO日志处理器
    if info_file:
        info_handler = RotatingFileHandler(
            info_file,
            maxBytes=10*1024*1024,  # 10MB
            backupCount=5
        )
        info_handler.setLevel(logging.INFO)
        info_handler.addFilter(InfoFilter())  # 添加过滤器
        info_formatter = logging.Formatter(
            "%(asctime)s - %(levelname)s - %(message)s"
        )
        info_handler.setFormatter(info_formatter)
        logger.addHandler(info_handler)

    # 配置ERROR日志处理器
    if error_file:
        error_handler = RotatingFileHandler(
            error_file,
            maxBytes=10*1024*1024,
            backupCount=5
        )
        error_handler.setLevel(logging.ERROR)
        error_formatter = logging.Formatter(
            "%(asctime)s - %(levelname)s - %(message)s - %(exc_info)s"
        )
        error_handler.setFormatter(error_formatter)
        logger.addHandler(error_handler)

    # 配置控制台输出(可选)
    if log_to_console:
        console_handler = logging.StreamHandler()
        console_handler.setLevel(logging.INFO)
        console_formatter = logging.Formatter(
            "%(levelname)s: %(message)s"
        )
        console_handler.setFormatter(console_formatter)
        logger.addHandler(console_handler)

    return logger

# 测试代码
if __name__ == "__main__":
    logger = initLogger(info_file="info.log", error_file="error.log")
    logger.info("这是一条INFO级日志")
    logger.error("这是一条ERROR级日志")

验证效果

运行测试代码后:

  • info.log中只会出现INFO级日志
  • error.log中只会出现ERROR级日志
  • 不会出现日志丢失或重复写入的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 11:24:16