logrotate -d 调试模式仅模拟轮转流程,不修改日志或状态文件,输出决策逻辑(如是否满足时间/大小条件、missingok/notifyempty 是否生效),但必须搭配 -v 才显示完整推理链,包括规则匹配、下次轮转时间计算及脚本跳过提示。

logrotate -d 调试模式到底输出什么
logrotate -d 不会修改任何日志文件,也不更新状态文件,但它会模拟整个轮转流程,并把每一步决策打印出来。你看到的不是“会不会执行”,而是“它认为该执行什么”——比如是否满足 daily 时间条件、是否达到 size=10M 门槛、missingok 是否生效、postrotate 脚本路径是否存在等。
关键点在于:它只读配置和当前文件状态,不写、不删、不压缩、不调脚本(postrotate 和 prerotate 内容会被列出但跳过执行)。
为什么必须搭配 -v 才能看到完整信息
单独用 logrotate -d 输出非常简略,通常只显示“considering log /var/log/nginx/access.log”这类提示。真正有用的细节(如匹配了哪条规则、计算出的下次轮转时间、是否因 notifempty 被跳过)必须加 -v:
-
logrotate -d -v /etc/logrotate.d/nginx→ 显示完整推理链 -
logrotate -d -v /etc/logrotate.conf→ 包含include /etc/logrotate.d/下所有文件的处理顺序 - 若配置里用了
sharedscripts,-v会明确标出“scripts will run once after all logs”
常见 debug 输出误判场景
调试时看到 “log does not need rotating” 别急着改配置,先核对这几处:
- 状态文件时间戳滞后:
logrotate -s /tmp/test.status -d -v config可绕过系统默认的/var/lib/logrotate/logrotate.status,避免旧状态干扰 - 日志文件权限不对:即使
create 0644 root root存在,若父目录/var/log/myapp不可写,-d会报 “skipping /var/log/myapp/app.log — open failed: Permission denied” - 路径通配符未展开:
/var/log/myapp/*.log在-d模式下若当前无匹配文件,直接跳过整段配置,不会报错也不会提示 -
ifempty和notifempty冲突:空文件 +notifempty→ 跳过;但-d输出里可能只写 “not rotating empty file”,容易被忽略
debug 模式下 postrotate 脚本的真实行为
logrotate -d 会解析 postrotate 块,但绝不执行其中命令。它只检查语法是否合法(比如 endscript 是否闭合),并打印类似 “running postrotate script for /var/log/nginx/error.log” 的提示——这行字只是占位符,不代表脚本真运行了。
如果你需要验证 postrotate 里的 systemctl reload nginx 是否有效,得手动复制那行命令去终端执行,或者用 logrotate -f -v 实际触发一次(确保在测试环境)。
最易被忽略的是:debug 模式下,sharedscripts 块里的脚本也完全不执行,哪怕配置里写了十行命令,输出里也只有一句 “running shared postrotate script”,没结果、没错误、没回显。











