missingok用于跳过不存在的日志文件而不报错:当指定路径无文件时,logrotate仅记录notice并继续处理后续配置;它仅解决enoent错误,不处理权限或路径拼写问题,需配合-d调试验证是否生效。

missingok 用来跳过不存在的日志文件,不报错继续执行
当 logrotate 扫描配置中指定的路径(比如 /var/log/myapp/debug.log)时,如果该文件压根没被程序创建过,缺省行为是直接报错退出,导致整个轮转任务中断——哪怕其他日志文件都存在。加了 missingok 后,logrotate 遇到这个情况只会打一条 notice 日志,然后跳过去处理下一个条目。
什么时候必须加 missingok
以下场景容易触发“文件不存在”,不加 missingok 就会失败:
- 服务是按需启动的(比如某个调试模块只在特定条件下写日志),
/var/log/myapp/debug.log可能长期为空或根本没生成 - 日志路径由变量或软链接动态决定,而链接目标尚未创建
- 多实例部署中,部分实例未运行,对应实例的日志路径自然为空
- 容器化环境里,日志挂载点存在但容器未首次启动,日志文件尚未 touch 过
missingok 和 notifempty 不是一回事
missingok 管的是“路径下连文件都没有”,notifempty 管的是“文件存在但大小为 0”。两者可以共存,且逻辑独立:
- 文件不存在 →
missingok起效,跳过 - 文件存在但为空 →
notifempty起效,跳过(前提是已启用) - 文件存在且非空 → 正常轮转
常见错误是把 missingok 当成万能静默开关,结果掩盖了路径拼写错误(比如写成 /var/log/myapp/debig.log)或权限问题(logrotate 用户根本读不到父目录)。它只跳过“ENOENT”,不解决“EACCES”或“ENOTDIR”。
怎么确认 missingok 真的生效了
别靠猜,用 debug 模式验证:
sudo logrotate -d /etc/logrotate.d/myapp
观察输出中是否出现类似这样的行:
notice: skipping /var/log/myapp/debug.log because file does not exist
如果有,说明 missingok 已加载并触发;如果没有,而是看到 error: error accessing /var/log/myapp/debug.log: No such file or directory,就要检查:missingok 是否拼错(比如写成 missok)、是否落在了错误的日志块内(必须紧贴对应路径块,不能放在全局段或别的块里)、有没有被注释符号意外截断。











