首页/系统/信创系统运维速查/logrotate 不执行的排查
服务与运维65 条

logrotate 不执行的排查

轮转未生效常见原因:规则语法问题、触发机制未运行、日志路径不匹配、未到周期;用 -d 演练、看 timer 与状态文件三步定位。

信创系统运维速查系统更新于 2026-10-13

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 参数与保留份数,避免误删还在用的日志。

易错点

  • 规则文件属主或权限不合规时会被静默跳过:一般要求 root 属主、不可组可写,改完用 -d 复跑确认已被读取。
  • log 路径写成绝对路径的具体文件名后,应用轮换命名(如 app.log.1)就再也匹配不上,需要按 glob 或改规则。
  • 未加 su 指令而日志目录属主为服务账户时,切换用户失败导致切割中止,日志只增不减。
  • 首次启用新规则后旧文件命名与新后缀混用,清理脚本按后缀匹配会漏删,产生多余占盘。
  • 只看文件没被切割就重装或重启服务是无效动作,问题通常在规则匹配与触发机制,先看状态文件里有没有记录。

数据来源与参考

  • man 8 logrotate(-d/-f/状态文件)
  • 红帽系统管理指南(日志轮转)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌