必须用delaycompress以避免压缩正在被apache写入的日志文件,确保安全:本次轮转生成的access.log.1暂不压缩,下轮才压缩为.gz,为apache释放文件句柄留出时间。

Apache 本身不直接压缩日志,日志压缩依赖系统级工具(主要是 logrotate)配合轮转策略实现。核心是:先轮转,再压缩,且需注意时机避免锁定正在写入的日志文件。
日志压缩的关键配置项
在 /etc/logrotate.d/apache2(Debian/Ubuntu)或 /etc/logrotate.d/httpd(CentOS/RHEL)中,以下参数共同构成压缩策略:
-
compress:启用 gzip 压缩旧日志(如access.log.1→access.log.1.gz) -
delaycompress:延迟压缩——本次轮转生成的access.log.1暂不压缩,等到下一轮转时才压缩为.gz,确保 Apache 有足够时间释放文件句柄 -
missingok:日志文件临时缺失也不报错,避免压缩流程中断 -
notifempty:空日志不参与轮转和压缩,节省资源
示例配置片段:
/var/log/apache2/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
}
为什么必须用 delaycompress?
Apache 进程持续向当前日志(如 access.log)写入。若 compress 不加 delaycompress,logrotate 可能在 Apache 尚未完全关闭旧文件时就尝试压缩 access.log.1,导致失败或损坏。delaycompress 提供安全窗口,让 Apache 有时间完成日志切换(通常通过 USR1 信号触发)。
验证压缩是否生效
运行强制轮转并观察:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
sudo logrotate -vf /etc/logrotate.d/apache2
成功后,你会看到类似输出:
renaming /var/log/apache2/access.log.1 to /var/log/apache2/access.log.2 compressing /var/log/apache2/access.log.2 using gzip
注意:.1 文件不会立即压缩,.2 及更旧的才会被 gzip 处理——这正是 delaycompress 的表现。
补充:压缩格式不可选,默认 gzip
logrotate 内置仅支持 gzip(.gz)。如需 .zst 或 .xz,需额外配置 compresscmd 和 uncompresscmd,但会增加维护复杂度,生产环境一般不推荐。
压缩策略本质上是“稳住轮转、延后压缩、自动清理”,不复杂但容易忽略 delaycompress 这个关键防护机制。









