You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:03:35