Python多线程Logging日志串写问题解决方案咨询
日志串写问题解决方案
问题原因
Python logging 模块的Logger采用单实例模式:多次调用logging.getLogger(name)传入相同名称时,会返回同一个Logger对象。你的config_logger函数每次调用都会给该Logger新增一个FileHandler,导致后续所有日志会输出到所有已添加的Handler对应的文件,这就是串写的根源。
解决方案
1. 配置Logger前清空已有Handler
修改config_logger函数,获取Logger后先清除所有已存在的Handler,避免重复添加:
def config_logger(name, mainlog): logger = logging.getLogger(name) # 清除已有Handler,防止同一Logger绑定多个文件输出 if logger.hasHandlers(): logger.handlers.clear() logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s : %(funcName)s : %(levelname)s --> %(message)s', datefmt='%m/%d/%Y %I:%M:%S%p') file_handler = logging.FileHandler(mainlog, 'w') file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger
2. 给不同功能的Logger分配唯一名称
在validations和dbstop函数中调用config_logger时,传入不同的名称前缀,确保两个功能的Logger实例完全隔离:
- 在
validations函数内:logger = config_logger(f"validation_{db}", 你的验证日志路径) - 在
dbstop函数内:logger = config_logger(f"dbstop_{db}", 你的停止日志路径)
3. 可选:使用独立Logger实例(进阶)
如果需要更彻底的隔离,可以直接创建logging.Logger的实例而非通过getLogger获取:
def config_logger(name, mainlog): # 创建全新的Logger实例,不共享全局单例 logger = logging.Logger(name) logger.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s : %(funcName)s : %(levelname)s --> %(message)s', datefmt='%m/%d/%Y %I:%M:%S%p') file_handler = logging.FileHandler(mainlog, 'w') file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger
这种方式完全避免了单例共享的问题,每个调用都会生成独立的Logger,彻底杜绝串写。
内容的提问来源于stack exchange,提问作者Avanish
相关产品推荐
相关产品推荐

