Python logging如何自动保留最近N个日志文件?是否需自行实现?
Python Logging 保留最近N个日志文件的实现方法
不用自己写删除旧文件的函数,Python的logging模块已经内置了现成的处理器可以直接实现这个需求,替代你当前用的basicConfig配置即可。
两种常用实现方式
1. 按文件大小轮转(保留最近10个文件)
使用RotatingFileHandler,当单个日志文件达到指定大小后,自动生成新文件,同时保留设置数量的旧文件,超出数量时自动删除最旧的那个。
示例代码:
import logging from logging.handlers import RotatingFileHandler # 创建logger实例 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 避免重复添加handler导致日志重复输出 if not logger.handlers: # 配置轮转文件处理器 handler = RotatingFileHandler( filename="logs/log.log", # 基础日志文件名 maxBytes=1024 * 1024, # 单个日志文件最大1MB(可根据需求调整) backupCount=10, # 保留10个备份文件,加上当前文件共11个;若要总文件数为10,设为9 encoding="utf-8", delay=False ) # 设置日志格式 formatter = logging.Formatter( "%(asctime)s %(levelname)-8s %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) handler.setFormatter(formatter) # 将处理器绑定到logger logger.addHandler(handler)
2. 按时间轮转(保留最近10个文件)
如果需要按时间周期(比如每天、每小时)生成新日志文件,用TimedRotatingFileHandler,同样通过backupCount控制保留的文件数量。
示例代码:
import logging from logging.handlers import TimedRotatingFileHandler # 创建logger实例 logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) if not logger.handlers: # 按天轮转的处理器配置 handler = TimedRotatingFileHandler( filename="logs/log.log", when="D", # 轮转周期:D=天,H=小时,M=分钟,S=秒,midnight=午夜 interval=1, # 间隔1个周期(这里是1天生成一个新文件) backupCount=10, # 保留最近10个日志文件 encoding="utf-8", delay=False ) formatter = logging.Formatter( "%(asctime)s %(levelname)-8s %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) handler.setFormatter(formatter) logger.addHandler(handler)
关键说明
- 这两个处理器默认使用追加模式(
filemode="a"),不会像你原来的basicConfig那样每次覆盖文件,符合日志记录的常规需求。 backupCount参数指定的是备份文件的数量,加上当前正在写入的文件,总文件数是backupCount + 1;如果需要严格保留10个文件,把backupCount设为9即可。- 多模块使用时,用
logging.getLogger(__name__)创建logger实例,并通过if not logger.handlers:判断避免重复添加处理器,防止日志重复输出。
内容的提问来源于stack exchange,提问作者Abel Gutiérrez
相关产品推荐
相关产品推荐

