logrotate默认用gzip压缩,但海量日志下可换zstd或lz4:高频写入选lz4(低延迟),长期归档选zstd-19(省空间),排查分析选zstd/lz4(流式解压快);需配齐compresscmd、compressext、compressoptions,并搭配delaycompress、notifempty等防踩坑。

logrotate 默认用 gzip 压缩,压缩率中等、CPU 占用低;但面对海量日志(如接入层访问日志、调试级应用日志),单纯依赖 gzip 往往陷入“要么空间大、要么 CPU 高”的两难。用 compresscmd 换用更现代的压缩算法(如 zstd、lz4),能在压缩率、速度、解压便利性之间取得更好平衡——关键不是盲目追求高压缩率,而是按日志特性选对工具。
哪些场景适合换压缩命令?
不是所有日志都值得换。优先考虑以下三类:
- 高频写入 + 中等体积日志:比如 Nginx access.log(每秒数百行)、Java 应用 debug 日志。用 lz4 可近乎零延迟压缩,I/O 不卡顿;
- 归档周期长 + 查看频次低的日志:如每月审计日志、备份操作日志。zstd -19 能比 gzip -9 多省 15–20% 空间,且解压仍快;
-
需快速解压分析的场景:运维排查时经常要
zcat/zless查看。zstd 和 lz4 原生支持流式解压,体验远好于 xz。
实操:配置 compresscmd 的关键步骤
必须配齐三项才生效,缺一不可:
-
安装对应压缩工具:例如
yum install zstd或apt install zstd; -
在 logrotate 配置块中声明三要素:
compresscmd /usr/bin/zstdcompressext .zstcompressoptions --ultra -T0 -19(zstd 示例;-T0 表示自动用满 CPU 核心,-19 是最高压缩级); - 保留 delaycompress(尤其搭配 copytruncate):避免刚截断就压缩,导致压缩空文件或损坏内容;
注意:compressoptions 必须与所选工具兼容。比如 lz4 不支持 -19,应改用 -9;xz 则用 -T0 -9。错误参数会导致 logrotate 静默失败(可用 logrotate -d 检查 stderr 输出)。
压缩算法对比参考(以 100MB 文本日志为基准)
(实测环境:Intel Xeon E5-2680 v4,Linux 6.6)
- gzip -9:压缩后 ~35MB,耗时 8.2s,CPU 峰值 110%;
- zstd -19:压缩后 ~28MB,耗时 14.5s,CPU 峰值 320%;
- zstd -3(推荐默认):压缩后 ~32MB,耗时 2.1s,CPU 峰值 130%;
- lz4 -9:压缩后 ~42MB,耗时 0.4s,CPU 峰值 95%;
结论:日常建议从 zstd -3 或 lz4 -9 入手——兼顾空间节省与系统负载,不牺牲稳定性。
别忽略配套设置
单换 compresscmd 不够,还需同步调整几个参数防踩坑:
- 加 notifempty:避免空日志也触发压缩,浪费 CPU;
- 设 rotate N 合理值:高压缩率日志可多留几份(如 rotate 30),因单个归档更小;
-
验证解压可用性:手动运行
/usr/bin/zstd -d /var/log/app.log.1.zst -o /tmp/test.log,确认能还原; - 不要全局替换:/etc/logrotate.conf 里只设默认,具体服务(如 /etc/logrotate.d/nginx)单独覆盖,避免影响 syslog 等关键日志。











