如何自定义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
相关产品推荐
相关产品推荐

