notifempty 用于跳过空日志文件的轮转,当日志大小为0字节时直接跳过归档、重命名等操作,避免生成无意义的空备份;默认行为是ifempty(隐式启用),会照常处理空文件。

notifempty 是用来跳过空日志文件的轮转
它不是“让空文件也被处理”,而是相反:当日志文件大小为 0 字节时,notifempty 会让 logrotate 直接跳过该次轮转,不归档、不重命名、不创建 .1 文件。这是防止产生一堆无意义的空备份(比如 app.log.1、app.log.2)的关键开关。
不加 notifempty 就会归档空文件
logrotate 默认行为是 ifempty(隐式启用),即不管日志有没有内容,只要触发轮转条件(比如到了 daily 时间点),就照常执行归档流程。后果包括:
-
app.log被重命名为app.log.1(哪怕它原本是空的) - 新的
app.log被create指令重建(如果配置了)或留空 - 压缩、rotate 计数、删除逻辑照常运行 —— 你可能在
/var/log/myapp/下看到一堆 0 字节的.1、.2文件
如何验证 notifempty 是否生效
手动模拟最可靠,三步到位:
- 清空目标日志:
truncate -s 0 /var/log/myapp/app.log - 强制触发轮转:
logrotate -vf /etc/logrotate.d/myapp - 观察输出和结果:
- 若看到类似
skipping "/var/log/myapp/app.log" because of notifempty的提示,说明生效 -
ls /var/log/myapp/应只保留原始app.log(且 size=0),没有app.log.1
- 若看到类似
容易被忽略的细节
很多人以为加了 notifempty 就万事大吉,但实际中几个点常出问题:
-
notifempty只检查文件 size == 0,不检查是否“有新内容写入但未 flush”——如果应用写日志后没刷新缓冲区,logrotate 可能误判为空 - 它只作用于当前配置块里的日志路径,不能跨文件生效;多个
/path/*.log匹配时,每个匹配到的空文件都会被单独判断 - 和
missingok不同,notifempty不影响缺失文件的报错逻辑;它只管“存在但为空”的情况 - 如果你用
postrotate脚本 reload 服务(如 nginx),跳过轮转后该脚本仍会执行 —— 这可能导致不必要的信号发送











