Python日志超出指定大小时如何自动拆分多文件且不删除旧日志?
按大小无上限拆分日志实现方案
Python标准库logging模块自带的RotatingFileHandler默认会在备份日志数量达到backupCount设定值时删除最早的旧日志,无法满足不删除旧日志、无上限拆分的需求。
自定义Handler实现无上限拆分
直接重写RotatingFileHandler的滚动逻辑,去掉删除旧日志的步骤,让备份文件序号持续递增即可,代码实现如下:
import os from logging.handlers import RotatingFileHandler class UnlimitedSizeRotatingHandler(RotatingFileHandler): def doRollover(self): if self.stream: self.stream.close() self.stream = None # 遍历目录找到当前最大的备份序号 max_index = 0 base_filename = os.path.basename(self.baseFilename) dir_path = os.path.dirname(self.baseFilename) or '.' for filename in os.listdir(dir_path): if filename.startswith(f"{base_filename}."): try: idx = int(filename.split('.')[-1]) if idx > max_index: max_index = idx except ValueError: continue # 生成新的备份文件 new_backup_name = f"{self.baseFilename}.{max_index + 1}" if os.path.exists(self.baseFilename): os.rename(self.baseFilename, new_backup_name) # 打开新的当前日志文件 if not self.delay: self.stream = self._open()
使用示例
直接替换你原来的RotatingFileHandler即可,不需要调整其他业务逻辑:
# 单个日志文件大小10MB,无上限保留所有历史日志 my_handler = UnlimitedSizeRotatingHandler( log_filename, mode='a', maxBytes=1024*1024*10, # backupCount参数无需生效,设为0即可 backupCount=0, encoding='utf-8', delay=0 )
方案说明
- 日志拆分后命名格式为
xxx.log.1、xxx.log.2、xxx.log.3...序号持续递增,不会自动删除任何旧日志 - 完全兼容原生
RotatingFileHandler的所有其他配置,原有日志写入、格式化逻辑不需要做任何修改 - 若你的场景日志拆分量级会达到数十万份,可以额外新增变量缓存当前最大序号,避免每次滚动时遍历目录,进一步提升性能
- 临时场景不想自定义类的话,也可以直接把原生
RotatingFileHandler的backupCount设为极大值(比如10000),按10MB单文件计算可支持最高100GB的总日志存储,足够覆盖大多数普通使用场景,本质仍有上限但改造成本最低
内容的提问来源于stack exchange,提问作者koshur
相关产品推荐
相关产品推荐

