Linux中logrotate压缩日志需配合轮转策略触发,必须设置rotate、compress及可选delaycompress;按时间(daily/weekly/monthly)或大小(size 100M)触发轮转后才执行压缩,delaycompress可延迟压缩以保障服务写入安全。

Linux 中配置 logrotate 定期压缩历史日志,关键不是“单独开启压缩”,而是通过轮转策略自然触发压缩动作。压缩是轮转后的一个环节,必须配合 rotate、compress 和可选的 delaycompress 一起使用才安全有效。
确认基础轮转条件已设置
logrotate 不会仅因“想压缩”就执行压缩,它只在发生轮转(即日志被重命名归档)时,才对旧归档文件执行 compress。所以第一步是明确轮转触发方式:
-
按时间轮转:用
daily、weekly或monthly。例如每天检查一次,有增长就切。 -
按大小轮转:用
size 100M(注意单位必须大写 M/G/K),满足即切,更适用于流量不均的服务。 - 两者可共存,满足任一即触发轮转。
启用压缩并控制压缩时机
压缩行为由三个指令协同控制:
-
compress:启用 gzip 压缩(默认),但需注意——它默认会对刚轮转出的文件立刻压缩。 -
delaycompress:延迟压缩一轮。比如今天轮转出app.log.1,不压;明天轮转出app.log.1(原app.log被重命名为此),同时把昨天的app.log.1压成app.log.1.gz。这对正在持续写入日志的服务(如 Nginx、应用进程未重启)更安全。 -
rotate N:指定最多保留 N 个归档(含压缩与未压缩)。只有超过这个数的最老归档,才会被删除。压缩本身不减少份数,只是节省空间。
写一个可用的压缩配置示例
以 /var/log/myapp/app.log 为例,在 /etc/logrotate.d/myapp 中写入:
/var/log/myapp/app.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 myapp myapp
sharedscripts
postrotate
systemctl kill --signal=USR1 myapp.service 2>/dev/null || true
endscript
}
说明:
- 每天检查是否轮转;空日志跳过;路径不存在也不报错。
- 最多留 30 份归档(如
app.log.1到app.log.30,其中较老的会被压缩为.gz)。 -
compress + delaycompress组合确保压缩总发生在“上一轮”的文件上,避免干扰当前写入。 -
postrotate发送 USR1 信号通知服务重新打开日志,保证新日志写入新文件。
验证与调试压缩是否生效
别直接上线,先测试:
- 用
logrotate -d /etc/logrotate.d/myapp查看模拟执行过程,确认是否提示 “compressing old log”。 - 手动触发一次:
logrotate -f /etc/logrotate.d/myapp,然后检查/var/log/myapp/下是否生成了.gz文件。 - 注意:生产环境慎用
-f,避免和 cron 冲突导致重复轮转。


















