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

