轮转不生效先别改配置
logrotate 是否轮转,取决于配置规则、状态文件里记录的上次轮转时间、文件属主与进程配合等多个环节,光看配置文件往往看不出问题。它自带的干跑与详查模式能直接打印判定过程:干跑告诉你「会做什么」,详查告诉你「实际做了什么」,是定位轮转问题最快的手段。
基本信息
| 适用平台 | Linux 各发行版(由 cron 或 systemd timer 触发) |
|---|---|
| 语法 | logrotate -d | -v | -f 配置文件 |
| 状态文件 | 通常位于 /var/lib/logrotate/ 下,记录每个日志上次轮转时间 |
| 触发方式 | 定时任务按天或按小时执行,单条日志还有 size 等条件 |
典型使用场景
- 日志文件一直变大,怀疑轮转根本没执行
- 刚改了轮转配置想立即验证,不等下一轮定时任务
- 轮转后进程仍写旧文件、磁盘空间没释放
- 新增了自定义日志,需要确认规则是否被匹配到
- 排查日志文件属主或权限在轮转后发生变化
调试流程
调试流程
sudo logrotate -d /etc/logrotate.d/nginx # 干跑:逐步打印判定过程,不实际执行
sudo logrotate -v /etc/logrotate.d/nginx # 实际执行并打印细节
sudo logrotate -vf /etc/logrotate.d/nginx # 忽略时间条件强制轮转
sudo cat /var/lib/logrotate/status | grep nginx # 看状态文件里记录的上次轮转时间
sudo systemctl list-timers | grep -i logrotate # 确认定时触发是否启用
ls -l /var/log/nginx/ # 核对轮转结果与属主检查配置
检查配置
sudo logrotate -d /etc/logrotate.conf 2>&1 | head -40 # 看全局配置与包含关系
awk '{print FILENAME": "$0}' /etc/logrotate.d/nginx | head -30 # 逐行核对规则
sudo journalctl -u logrotate --since today # 定时任务侧的执行记录常见症状与原因
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 到点没轮转 | 时间条件未满足或状态文件记录较新 | 先干跑看判定,必要时用 -f 验证 |
| 轮转成功但空间没释放 | 进程仍持有旧文件句柄没重开 | 检查 postrotate 的通知命令或改用复制截断模式 |
| 新日志属主变成 root | 轮转后重建文件与进程属主不一致 | 确保新建文件继承原属主 |
| 配置改了不生效 | 语法错误被静默跳过 | 干跑会打印解析错误,先修语法 |
logrotate 由定时任务触发,刚改完配置要等下一轮;用 -f 可以立刻验证一次,但会真实执行轮转,生产上注意影响。