使用logging.basicConfig与RotatingFileHandler:重复日志及日志缺失问题求助
Python logging:移除basicConfig后RotatingFileHandler日志不全的原因与解决办法
你遇到的这个问题其实是Python logging模块的级别过滤机制在搞鬼,咱们一步步拆解清楚:
为什么移除basicConfig后日志不全?
当你只使用RotatingFileHandler而不调用basicConfig时,根logger(logging.getLogger(''))的默认级别是WARNING——也就是说,只有级别≥WARNING的日志(比如WARNING、ERROR、CRITICAL)才会被放行,而DEBUG、INFO级别的日志会直接被根logger过滤掉,哪怕你给handler设置了setLevel(lvl)也没用。
这是因为logging的过滤是两级过滤:
- 第一步:根logger先检查日志级别是否≥自己的级别,不满足的直接丢弃
- 第二步:通过logger过滤后,才会交给各个handler,handler再检查是否≥自己的级别
你修改后的代码只给handler设置了级别,但根logger还是默认的WARNING,所以如果你的lvl是DEBUG或INFO,那些低级别日志根本到不了handler就被根logger拦下来了。
而之前用basicConfig时,它除了自动添加一个FileHandler外,还会帮你把根logger的级别改成你传入的lvl——这就是为什么当时能记录所有日志。
怎么解决?
只需要在添加handler之前,手动设置根logger的级别就行,修改后的代码示例:
import logging from logging.handlers import RotatingFileHandler # 假设你的格式、日期格式、级别、文件名已定义 f = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') date = '%Y-%m-%d %H:%M:%S' lvl = logging.DEBUG file_name = 'app.log' handler = RotatingFileHandler(file_name, maxBytes=1000000, backupCount=5) handler.setFormatter(f) handler.setLevel(lvl) # 关键:手动设置根logger的级别,确保低于或等于handler的级别 root_logger = logging.getLogger('') root_logger.setLevel(lvl) root_logger.addHandler(handler)
再补充下之前重复日志的原因?
当你调用logging.basicConfig(filename=file_name)时,它会自动给根logger添加一个FileHandler,然后你又手动添加了一个RotatingFileHandler——两个handler都指向同一个文件,所以同一条日志会被输出两次,自然就出现了重复。
总结一下核心要点:
- 避免重复日志:不要同时用
basicConfig自动添加handler和手动添加handler,二选一即可 - 确保日志完整:必须保证根logger的级别 ≤ handler的级别,否则低级别日志会被根logger提前过滤
内容的提问来源于stack exchange,提问作者szefew
相关产品推荐
相关产品推荐

