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)
核心机制与并发安全
日志轮转的核心思想是在满足特定条件时自动重命名或归档当前日志文件。在多进程环境下,多个进程同时写入同一日志文件容易引发竞争。建议使用 concurrent_log_handler 库来确保原子性操作。
配置管理与监控
通过 logging.config 模块可动态调整日志行为。结合监控系统(如 Prometheus)可对错误日志速率进行告警。
- alert: HighErrorLogRate
expr: rate(log_error_count[5m]) > 10
总结
合理配置日志轮转策略能有效保障磁盘空间,提升系统可维护性。建议根据业务场景选择按大小或按时间轮转,并配合外部监控工具实现自动化运维。

