logrotate 本身并 不会主动控制时间,它只是一个日志轮转工具,实际执行时间由 调用它的任务调度器 决定。
在 Linux 系统上,主要有两种方式:
通过 cron 调度(传统方式)
系统会在 /etc/cron.daily/logrotate 中配置 daily 执行脚本:
cat /etc/cron.daily/logrotate

cron.daily 默认执行时间:
由系统的 run-parts 调度,一般在 凌晨 6 点左右(不同发行版略有差异),默认每天执行一次。
原理:
- logrotate 脚本由 cron 调用
- logrotate 检查配置文件(如 /etc/logrotate.d/apache2)
- 满足轮转条件(时间或大小)则执行轮转
优点:简单、稳定、系统自带
缺点:执行时间固定,无法灵活调整到你希望的低峰期
自定义 cron 定时(更灵活)
你可以自己写 cron 任务,让 logrotate 在指定低峰时间执行,例如凌晨 2 点:
# 编辑 crontab
sudo crontab -e
# 每天凌晨 2 点执行 logrotate
0 2 * * * /usr/sbin/logrotate /etc/logrotate.conf
这样就可以完全控制轮转时间
可以针对高流量日志(Gunicorn 大日志)放在流量低时执行
按日志大小轮转(size-based rotation)
logrotate 配置中支持 size 参数:
/var/www/fastapi/logs/*.log {
size 100M # 文件大于 100MB 才轮转
rotate 7
compress
copytruncate
}
原理:
- cron 每天检查日志
- 仅当日志大小超过阈值才轮转
- 避免低峰期没有必要的轮转
建议策略(生产环境)
| 方法 | 优点 | 注意事项 |
|---|---|---|
| cron.daily | 系统自带,简单 | 执行时间固定,可能不完全低峰 |
| 自定义 cron | 灵活控制轮转时间 | 需要自己维护 crontab |
| size-based | 避免频繁轮转大日志 | 配合定时执行效果最佳 |
| compress + delaycompress | 避免压缩正在写的日志 | 减少 CPU 和 IO 高峰 |