logrotate 轮转不生效怎么查
logrotate 由 timer 或 cron 周期触发,日志没被切割时先分清是规则没跑、规则被跳过,还是路径根本没匹配上。排查主线只有三步:用 -d 空跑看它解析出了什么、确认触发机制是否在运行、再看状态文件里有没有这条记录。切忌直接 -f 强转,先看清楚再动手。
基本信息
| 规则目录 | /etc/logrotate.conf 主配置 + /etc/logrotate.d/ 片段 |
|---|---|
| 状态文件 | RPM 系 /var/lib/logrotate/logrotate.status,Debian 系 /var/lib/logrotate/status |
| 常用调试参数 | -d 空跑不切割、-v 详细输出、-f 强制旋转、--state 指定状态文件 |
| 触发方式 | logrotate.timer(systemd 系)或 cron.daily/anacron 脚本 |
典型使用场景
- 新加了一条应用日志规则,想先确认匹配与参数是否符合预期
- 磁盘告警发现某个 /var/log 下的大文件长期没被切割
- 改写规则后想验证语法,但不希望真的动线上日志
- 临时腾空间:确认安全后用 -f 强制旋转并配合删除旧副本
- 搬迁到新发行版后,默认触发机制从 cron 换成 timer 需要重新确认
四步排查
四步排查
logrotate -d /etc/logrotate.d/myapp 2>&1 | head -40 # 空跑:看匹配到的文件与判定结果
logrotate -v /etc/logrotate.d/myapp 2>&1 | tail -20 # 详细模式:看它做了什么
systemctl list-timers logrotate.timer --all # 确认 timer 是否启用与下次触发
journalctl -u logrotate -n 50 --no-pager # 看本轮执行的报错
cat /var/lib/logrotate/logrotate.status | grep myapp # 看上次轮转时间是否被记录空跑输出的关键判读
| 输出片段 | 含义 | 后续动作 |
|---|---|---|
| reading config file | 配置文件已被读取 | 没出现说明规则文件路径写错或权限被拒 |
| considering log /var/log/xx | 该文件被纳入本次判断 | 没有这行说明 log 路径与 glob 不匹配 |
| log does not need rotating | 未到周期或不满足 size 条件 | 检查 daily/size、以及状态文件里的上次时间 |
| skipping ... parent directory | 目录属主或权限不符 | 检查目录属组与规则里的 su 配置 |
| error: ... unknown option | 规则语法错误 | 按报错行修正后重新空跑 |
RPM 系可能由 anacron 或 cron.daily 触发而非 timer:两条路径都要看,先确认本机实现再下结论。
手工 logrotate -f 会立即切割并可能删除最旧副本,执行前先确认 copytruncate/rotate 参数与保留份数,避免误删还在用的日志。