排查 logrotate 配置语法错误的关键是用 -d 模式验证解析结果,确认目标路径是否出现在“rotating pattern”中;若自定义配置未出现,需检查 /etc/logrotate.conf 中 include /etc/logrotate.d 是否被注释或路径错误;同时注意大括号格式、路径存在性、missingok 与 create 冲突、文件权限等常见静默失效问题。

排查 logrotate 配置文件语法错误,关键不是盲目改配置,而是用工具验证、分层定位——logrotate 本身不报错退出,但语法错会导致规则被跳过,表面“没轮转”,实则“没加载”。
用 -d 模式看实际解析结果
这是最直接有效的方法。logrotate 的 -d(debug) 模式不执行轮转,只打印它“打算做什么”,包括是否匹配到日志文件、加载了哪些规则、参数是否被正确识别。
- 运行:
sudo logrotate -d /etc/logrotate.conf - 重点观察输出中是否有类似
error: ... line X: ...的提示;没有报错 ≠ 配置生效,要确认目标日志路径是否出现在 “rotating pattern” 列表里 - 如果某自定义配置(如
/etc/logrotate.d/myapp)完全没出现在 debug 输出中,说明它根本没被 include 加载(见下一条)
检查 include 行是否被注释或路径错误
/etc/logrotate.conf 末尾的 include /etc/logrotate.d 是开关——它一旦被注释或写错,整个 /etc/logrotate.d/ 目录下的配置全部失效,且不报错。
- 打开主配置:
sudo nano /etc/logrotate.conf - 找到包含
include的行,确认它未被 # 注释,且路径严格为include /etc/logrotate.d(不能多空格、不能带结尾斜杠/etc/logrotate.d/) - 该行之后的全局设置(如
rotate 4)仍生效,但子配置不加载,所以你单独为某个服务写的规则不会起作用
验证配置文件格式和权限
logrotate 对语法敏感,常见低级错误会静默忽略整段规则:
-
大括号必须成对且换行正确:
/var/log/app.log {和}必须各自独占一行,中间不能有空行或缩进错乱 -
路径必须存在且可读:如果配置了
/var/log/myapp/app.log,但该文件或目录不存在,且没加missingok,logrotate 会跳过该段(不报错,但也不处理) -
避免 missingok 和 create 共用:两者逻辑冲突——
missingok让 logrotate 忽略缺失文件,create却需要创建新文件;若原路径不存在,它可能既不报错也不创建,导致后续程序写日志失败 -
文件权限需为 644 或更严格:logrotate 只读取 root 或特定用户可读的配置文件;如果
/etc/logrotate.d/myapp权限是 600 且属主不是 root,会被跳过
手动触发并查看状态文件
绕过 cron,强制运行一次,再查记录,能快速验证配置是否被识别:
- 执行:
sudo logrotate -f /etc/logrotate.conf(-f 强制执行,注意:这会真实轮转,慎用于生产环境) - 检查状态文件:
sudo cat /var/lib/logrotate/status,看目标日志路径是否已记录最后轮转时间;如果没有,说明配置未命中或路径不匹配 - 同时检查系统日志:
sudo journalctl -u cron | grep logrotate或sudo tail -20 /var/log/syslog | grep logrotate,确认 cron 是否成功调用了它











