Python 日志文件自动轮转实践方案
在长时间运行的服务中,日志文件会持续增长,若不加以管理,可能迅速耗尽磁盘空间,甚至导致服务异常。为解决这一问题,Python 提供了内置的日志轮转机制,能够按大小或时间自动切割日志文件,有效控制单个文件体积。
按大小轮转:RotatingFileHandler
Python 标准库中的 logging.handlers.RotatingFileHandler 支持基于文件大小的轮转策略。当日志文件达到指定大小时,自动重命名并创建新文件。
import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('rotating_logger')
logger.setLevel(logging.INFO)
handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=5)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("这是一条测试日志")
上述代码中,maxBytes 设定单个文件最大尺寸,backupCount 控制保留的旧日志文件数量。当 app.log 达到 10MB 时,会被重命名为 app.log.1,并生成新的 app.log。
按时间轮转:TimedRotatingFileHandler
若需按天、小时等时间单位切分日志,可使用 TimedRotatingFileHandler。
| 参数 | 说明 |
|---|---|
| when | 轮转周期(S: 秒,M: 分钟,H: 小时,D: 天) |
| interval | 周期间隔 |
| backupCount | 保留的备份文件数 |
示例配置每日午夜轮转:
import logging
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger("timed_logger")
handler = TimedRotatingFileHandler("app.log", when="midnight", interval=1, backupCount=7)
handler.suffix = "%Y-%m-%d"
logger.addHandler(handler)

