logrotate延后一天压缩历史日志需同时配置compress和delaycompress:前者启用gzip压缩,后者使本次轮转产生的旧日志(如app.log.1)暂不压缩,待下一轮转时才压缩为app.log.1.gz,确保正在写入的日志安全。

要让 logrotate 延后一天压缩历史日志,核心是组合使用 compress 和 delaycompress 这两个参数。
compress 表示启用压缩(默认用 gzip),而 delaycompress 的作用是:本次轮转产生的旧日志不立即压缩,等到下一次轮转时,才对上一轮的归档文件进行压缩。这样就实现了“延后一天压缩”。
比如,今天(7月29日)触发轮转,产生 app.log.1,它保持未压缩状态;明天(7月30日)再次轮转时,app.log.1 才被压缩成 app.log.1.gz,同时生成新的 app.log.1(原 app.log 被重命名为 app.log.1,原 app.log.1 变为 app.log.2,依此类推)。
这个机制特别适合搭配 copytruncate 使用——因为服务不能停,日志文件被截断后还在持续写入,若立刻压缩刚截断的文件,可能压到空内容或损坏数据。delaycompress 就是为此类场景设计的安全兜底。
关键配置写法
在你的 logrotate 配置块中(例如 /etc/logrotate.d/myapp):
/var/log/myapp/*.log {
daily
missingok
notifempty
rotate 14
compress
delaycompress
copytruncate
create 0644 myapp myapp
}注意几点:
-
compress和delaycompress必须同时出现才有延迟效果;只写delaycompress不写compress无效。 -
delaycompress不影响rotate数量计算——.gz文件和未压缩的.1文件都计入保留总数。 - 如果某次轮转没触发(比如日志为空且启用了
notifempty),那上一轮未压缩的文件会继续等待,直到下次真正轮转才压缩。
验证是否生效
可手动模拟运行并观察行为:
logrotate -d /etc/logrotate.conf
调试输出里会明确显示 “compressing … with delay” 或类似提示。确认无误后,再用 -f 强制跑一次测试:
logrotate -f /etc/logrotate.d/myapp
检查 /var/log/myapp/ 下是否出现未压缩的 .1 文件,隔天再看它是否变成 .1.gz。
常见误区提醒
- 不要以为
delaycompress是“延后 N 天”,它只延后一轮(即等下一次轮转周期到来)。 - 若配置了
weekly但实际 cron 每天执行,仍按每天判断是否轮转,delaycompress也按实际轮转节奏生效。 - 日志路径含空格或特殊字符时,整个路径必须用英文引号包裹,否则解析失败。


















