logrotate配置中compress未生效通常因轮转未实际触发或参数组合不当:需确认daily/size等条件满足、无nocompress覆盖、copytruncate必配delaycompress,且gzip可用。

logrotate 配置里写了 compress,但轮转后日志没压缩——这通常不是 bug,而是参数组合或触发逻辑没对上。
compress 参数本身不保证每次切割都压缩
logrotate 的 compress 只在满足「轮转动作真正发生」时才起作用。如果某次 cron 运行时,logrotate 检查发现日志没增长、没达到 size 阈值、也没到 daily/weekly 触发点,它就什么也不做,自然也不会压缩。
- 用
logrotate -d /etc/logrotate.conf调试,看输出里有没有rotating log行;没有就说明根本没轮转,更谈不上压缩 -
missingok和notifempty同时存在时,空日志文件会被跳过,不触发轮转 - 路径写错、权限不足(比如 logrotate 无法读取日志文件或写入目标目录)也会静默失败
copytruncate + compress 容易踩 delaycompress 的坑
如果你用了 copytruncate(常见于 Nginx、Java 应用等不能停服务的场景),又没加 delaycompress,logrotate 会尝试立刻压缩刚被截断的旧文件——但此时应用可能还在往新文件写,旧文件内容已不完整,压缩器可能报错或生成空 .gz 文件,最终被丢弃。
- 正确搭配是:
copytruncate必须配delaycompress -
delaycompress的意思是:本次轮转出的.1文件先不压,等下次轮转时再把.1压成.1.gz,而本次只生成未压缩的.1 - 单独写
compress在copytruncate场景下基本无效
压缩命令或扩展名配置错误
logrotate 默认用 gzip,但如果系统没装、路径不对,或你手动改过 compresscmd,就可能静默失败。
- 检查
which gzip是否有输出;若无,装gzip或显式指定:compresscmd /usr/bin/gzip - 如果用了
compressext .zst却没装zstd,压缩会跳过,且不报错 - 注意:
nocompress是全局禁用,哪怕配置里写了compress也会被覆盖
最常被忽略的是:logrotate 不是“一配就压”,它严格按条件触发,且压缩行为高度依赖上下文组合。别只盯 compress 这一行,得连着看 copytruncate、size、daily、notifempty 一起是否闭环。


















