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

如何自定义Python中RotatingFileHandler的日志文件名及轮转顺序?

自定义日志轮转文件名与顺序的实现方案

核心思路

Python标准库的RotatingFileHandler默认命名规则和轮转逻辑无法匹配需求,因此需要自定义Handler继承自RotatingFileHandler,重写文件名生成与轮转执行的核心方法。

实现步骤

1. 自定义日志轮转Handler

创建CustomRotatingFileHandler类,重写两个关键方法,实现自定义命名规则与轮转顺序:

import os
import logging.handlers

class CustomRotatingFileHandler(logging.handlers.RotatingFileHandler):
    def getFilesToRotate(self):
        # 生成格式为 main-00.log 到 main-99.log 的备份文件列表
        dir_name, base_name = os.path.split(self.baseFilename)
        file_root, file_ext = os.path.splitext(base_name)
        backup_files = []
        for i in range(self.backupCount):
            backup_filename = os.path.join(dir_name, f"{file_root}-{i:02d}{file_ext}")
            backup_files.append(backup_filename)
        return backup_files

    def doRollover(self):
        if self.stream:
            self.stream.close()
            self.stream = None
        
        # 从最旧到次新的备份文件依次向后覆盖:main-01.log → main-00.log,以此类推
        backup_files = self.getFilesToRotate()
        for i in range(len(backup_files)-1):
            src = backup_files[i+1]
            dst = backup_files[i]
            if os.path.exists(src):
                os.replace(src, dst)
        
        # 将当前日志文件转存为最新备份:main.log → main-99.log
        if os.path.exists(self.baseFilename):
            latest_backup = backup_files[-1]
            os.replace(self.baseFilename, latest_backup)
        
        # 重新打开当前日志文件,继续写入
        self.mode = 'a'
        self.stream = self._open()

2. 修改日志配置

在dictConfig中,将文件处理器的类指定为自定义的Handler(注意类路径:如果和主代码同文件,用__main__.CustomRotatingFileHandler;如果是单独模块,用模块名.CustomRotatingFileHandler)

修改后的完整配置:

import logging.config
import sys

# 先导入/定义上述自定义Handler

logging.config.dictConfig(
    {
        "version": 1,
        "disable_existing_loggers": False,
        "formatters": {
            "format": {"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"}
        },
        "handlers": {
            "console": {
                "class": "logging.StreamHandler",
                "formatter": "format",
                "stream": "ext://sys.stdout",
            },
            "file": {
                "class": "__main__.CustomRotatingFileHandler",
                "filename": "data/logs/main.log",
                "mode": "a",
                "formatter": "format",
                "maxBytes": 1024 * 1024,
                "backupCount": 100,
            },
        },
        "root": {"handlers": ["console", "file"], "level": "DEBUG"},
    }
)

逻辑说明

  • 文件名规则:通过getFilesToRotate生成带两位数字后缀的备份文件名,确保格式统一为main-xx.log。
  • 轮转顺序:轮转时先完成旧文件的向后覆盖,再将当前日志转存为最大编号的备份文件,最终实现:
    • main-00.log始终存储最旧的轮转日志
    • main-99.log始终存储最新的轮转日志
    • main.log始终是当前正在写入的日志文件

内容的提问来源于stack exchange,提问作者negar amiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:34:56