Python配置两个独立日志实例却出现日志重复写入问题如何解决
问题原因
- 核心问题出在Python
logging模块的单例机制:logging.getLogger(name)是按传入的名称全局唯一的,你两个日志类中都传入了相同的名称"Rotating Log",实际拿到的是同一个logger实例。你先后给这个实例绑定了两个对应不同日志文件的handler,所以只要该logger输出日志,两个handler都会触发写操作,自然所有日志会同时写入两个文件。 - 额外语法问题:你的代码中调用了
datetime.today()但没有提前导入datetime模块,运行时会直接抛出导入错误。
修正方案
你只需要给两个日志实例分配不同的唯一名称即可,同时可以简化冗余的重复类定义,优化后的代码如下:
import logging import datetime from logging.handlers import TimedRotatingFileHandler def create_timed_rotating_log(logger_name, log_path): # 按不同名称获取独立的logger实例 logger = logging.getLogger(logger_name) # 避免重复导入时重复添加handler,导致单条日志重复写入 if logger.handlers: return logger logger.setLevel(logging.INFO) handler = TimedRotatingFileHandler(log_path, when="d", interval=1, backupCount=7) formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') handler.setFormatter(formatter) logger.addHandler(handler) # 关闭日志向上传递到根logger,避免日志同时输出到控制台或其他根handler logger.propagate = False return logger today = datetime.datetime.today() month = today.strftime("%B") # 传入不同的logger名称实现隔离 logger = create_timed_rotating_log("op_logger", f'./{month + str(today.year)}Logger.log') webhook_logger = create_timed_rotating_log("webhook_logger", f'./{month + str(today.year)}WebhookLogger.log')
修改后你原来的entrypoint.py和op_helper.py的引用逻辑不需要改动,日志就会分别写入对应的目标文件。
内容的提问来源于stack exchange,提问作者Kevin G
相关产品推荐
相关产品推荐

