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

如何在Python中为每个日志级别维护独立的日志文件?

问题分析

你当前代码里的file_handler.setLevel(logging.INFO)是让handler处理大于等于INFO级别的日志,所以ERROR、CRITICAL、WARNING这些级别更高的日志也会被写入文件,这就是文件里出现其他级别日志的原因。要实现每个级别单独输出到不同文件且无重复,需要用**日志过滤器(Filter)**来精确匹配单一级别,而非依赖handler的级别阈值。

解决方案

自定义过滤器类,只允许指定级别的日志通过,为每个日志级别创建独立的FileHandler并绑定对应过滤器,同时保证logger的级别足够低(比如DEBUG),确保所有级别的日志都能传递到handler层面进行筛选。

完整代码示例

import logging

# 自定义过滤器:只允许指定级别的日志通过
class LevelFilter(logging.Filter):
    def __init__(self, level):
        self.level = level

    def filter(self, record):
        # 精确匹配日志级别,仅保留指定级别的日志
        return record.levelno == self.level

# 初始化logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)  # 设置为最低级别,确保所有日志都能被handler接收
formatter = logging.Formatter('%(asctime)s : %(name)s : %(levelname)s : %(message)s')

# 为每个级别创建独立的handler和过滤器
# DEBUG级别
debug_handler = logging.FileHandler('debug.log')
debug_handler.setFormatter(formatter)
debug_handler.addFilter(LevelFilter(logging.DEBUG))
logger.addHandler(debug_handler)

# INFO级别
info_handler = logging.FileHandler('info.log')
info_handler.setFormatter(formatter)
info_handler.addFilter(LevelFilter(logging.INFO))
logger.addHandler(info_handler)

# WARNING级别
warning_handler = logging.FileHandler('warning.log')
warning_handler.setFormatter(formatter)
warning_handler.addFilter(LevelFilter(logging.WARNING))
logger.addHandler(warning_handler)

# ERROR级别
error_handler = logging.FileHandler('error.log')
error_handler.setFormatter(formatter)
error_handler.addFilter(LevelFilter(logging.ERROR))
logger.addHandler(error_handler)

# CRITICAL级别
critical_handler = logging.FileHandler('critical.log')
critical_handler.setFormatter(formatter)
critical_handler.addFilter(LevelFilter(logging.CRITICAL))
logger.addHandler(critical_handler)

# 测试日志输出
logger.debug("this is debug")
logger.info("this is info")
logger.warning("this is warning")
logger.error("this is error")
logger.critical("this is critical")

关键说明

  • LevelFilter类:重写filter方法,通过record.levelno精确匹配日志级别,只有级别完全一致的日志才会被handler处理,避免高级别日志混入低级别文件。
  • logger级别设置:必须设为logging.DEBUG(最低级别),否则低于该级别的日志会被logger直接过滤,无法传递到handler层面。
  • 独立handler:每个级别对应一个FileHandler,确保日志分别写入不同文件,且无重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:31:02