如何定位并阻止导入模块在控制台重复打印日志?
解决Python日志控制台重复打印问题
问题根源
Python的logging模块在首次输出日志时,会自动为根日志器(logging.getLogger())添加一个默认的StreamHandler,这个handler仅输出日志消息文本,不带格式化信息。而你手动给根日志器又添加了一个自定义的StreamHandler,导致同一条日志被两个handler处理,最终控制台出现重复输出。
解决方案
修改你的get_log()函数,做以下两处调整:
- 配置根日志器前清空已有handler,消除默认handler的干扰
- 给控制台handler设置格式化器,确保输出统一的格式化日志
修改后的完整代码:
def get_log(): import logging import sys from logging.handlers import TimedRotatingFileHandler # 获取根日志器 base_logger = logging.getLogger() base_logger.setLevel(logging.DEBUG) # 清空根日志器所有已有handler,避免默认StreamHandler导致重复 base_logger.handlers.clear() # 创建文件handler file_handler = TimedRotatingFileHandler( 'logs/runtime.log', when='midnight', interval=1, backupCount=7, encoding='utf-8' ) file_handler.namer = my_namer file_handler.setLevel(logging.DEBUG) # 创建控制台handler console_handler = logging.StreamHandler(stream=sys.stdout) console_handler.setLevel(logging.INFO) # 定义格式化器并绑定到两个handler main_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(main_format) console_handler.setFormatter(main_format) # 将handler添加到根日志器 base_logger.addHandler(file_handler) base_logger.addHandler(console_handler)
说明
- 清空根日志器的
handlers列表,彻底避免了默认handler和自定义handler重复处理日志的问题 - 给控制台handler设置格式化器后,控制台只会输出你定义的格式化日志,符合预期
- 无需设置
propagate=False,各模块的日志依然会正常向上传播到根日志器,通过你配置的handler输出
内容的提问来源于stack exchange,提问作者Victor N
相关产品推荐
相关产品推荐

