Python RotatingFileHandler轮转后写入随机文件及提前轮转问题求助
解决RotatingFileHandler轮转后写入异常的问题
你的问题核心是重复给同一个Logger实例添加RotatingFileHandler,导致多个Handler同时操作同一个日志文件,引发轮转逻辑混乱。
问题原因
logging模块的Logger是单例模式,多次调用logging.getLogger(log_name)会返回同一个实例。你的get_logger函数每次被调用时,都会给该Logger新增一个RotatingFileHandler。多个Handler会独立判断日志文件大小,一旦其中一个触发轮转,其他Handler的文件指针可能仍指向旧的备份文件,导致后续写入错位;同时多Handler的大小判断会互相干扰,出现未达阈值就提前轮转的情况。
解决方案
修改get_logger函数,确保每个Logger实例只添加一次Handler:
import os import logging from logging.handlers import RotatingFileHandler # 假设log_path是已定义的全局变量 log_path = "./logs" def get_logger(log_name, log_filename): log = logging.getLogger(log_name) # 检查Logger是否已有Handler,避免重复添加 if log.handlers: return log logs_file = os.path.join(log_path, log_filename) log.setLevel(logging.DEBUG) file_formatter = logging.Formatter('%(asctime)s - %(pathname)s - %(levelname)s - %(message)s') file_handler = RotatingFileHandler(logs_file, maxBytes=int(1.5e7), backupCount=15) file_handler.setFormatter(file_formatter) file_handler.setLevel(logging.DEBUG) log.addHandler(file_handler) return log
补充说明
如果你的场景中需要动态更新Handler配置(比如修改日志路径或格式),可以改为先清空已有Handler再重新添加,但要注意这会清除所有已配置的Handler,需谨慎使用:
def get_logger(log_name, log_filename): log = logging.getLogger(log_name) # 清空已有Handler,重新配置 log.handlers.clear() logs_file = os.path.join(log_path, log_filename) log.setLevel(logging.DEBUG) file_formatter = logging.Formatter('%(asctime)s - %(pathname)s - %(levelname)s - %(message)s') file_handler = RotatingFileHandler(logs_file, maxBytes=int(1.5e7), backupCount=15) file_handler.setFormatter(file_formatter) file_handler.setLevel(logging.DEBUG) log.addHandler(file_handler) return log
这样修改后,每个Logger只会绑定一个RotatingFileHandler,轮转逻辑会正常工作,始终写入最新的目标日志文件,直到达到maxBytes阈值才触发轮转。
内容的提问来源于stack exchange,提问作者sefrof chan
相关产品推荐
相关产品推荐

