delaycompress 使本次轮转产生的旧日志(如 .1)暂不压缩,待下一轮轮转时再将其压缩为 .1.gz,需与 compress 配合使用,解决 copytruncate 场景下的竞态问题。

delaycompress 是怎么起作用的
delaycompress 不是“等一天再压缩”,而是“本次轮转产生的旧日志不压缩,留到下一次轮转时才压缩上一轮的”。它解决的是 copytruncate 场景下的竞态问题:服务不停机,用 truncate 清空当前日志后继续写入,若立刻 compress,可能压到刚清空的文件或正在写的碎片内容。
必须搭配 compress 使用
单独写 delaycompress 没有效果,它只是 compress 的补充开关。正确写法是:
- compress:启用压缩(默认用 gzip)
- delaycompress:延迟压缩一轮,即 .1 文件这次不压,下次轮转生成 .2 时,才把原来的 .1 压成 .1.gz
例如某天执行轮转后,目录里是:
app.log(新日志)
app.log.1(刚切出来的旧日志,未压缩)
app.log.2.gz(上一轮被延迟压缩后的归档)
典型配置片段示例
以 Nginx 访问日志为例,/etc/logrotate.d/nginx 中可这样写:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
注意:create 权限和属主要匹配 Nginx 实际运行用户,否则新日志可能无法写入;sharedscripts + postrotate 确保 reload 只执行一次,避免多个日志文件重复触发。
验证是否生效
别等一天看结果,用调试和强制方式快速验证:
- 先跑一次调试:
logrotate -d /etc/logrotate.conf,观察输出中是否有compressing log with delay类提示 - 再手动触发一轮:
logrotate -f /etc/logrotate.conf,检查 /var/log/nginx/ 下是否出现未压缩的 .1 文件 - 隔几小时或第二天再触发一次,确认 .1 变成 .1.gz,同时新增 .1(原 .1 升级为 .2,新日志为 .1)


















