logrotate默认不压缩日志,必须显式配置compress参数才启用gzip压缩;若配合copytruncate或服务重载,需加delaycompress避免压缩空文件,且要注意父目录权限安全限制。

compress 参数必须显式开启,否则默认不压缩
logrotate 默认不会压缩归档日志,即使你看到 gzip 是内置支持的,也得手动加 compress 才生效。不写这行,切割出来的 access.log-1、access.log-2 就是纯文本,体积大、占磁盘快。
delaycompress 要配合 copytruncate 或服务重载场景使用
如果你用了 copytruncate(比如 Nginx 不停机切日志),或者在 postrotate 里 reload 服务,那必须加 delaycompress。否则会出现:刚 truncate 完旧文件,logrotate 立刻 gzip —— 此时新进程可能还没完全切到新文件,压缩的其实是空或半截内容。
-
compress:本次切割完立刻压缩access.log-1 -
delaycompress:本次不压access.log-1,等下次轮转时再压它,同时生成access.log-2
压缩失败常见原因:父目录权限太松或没配 su
报错 error: skipping "/path/to/log" because parent directory has insecure permissions 很典型——比如日志路径是 /opt/app/logs/,而该目录权限是 0777 或属组可写但不是 root。logrotate 出于安全默认拒绝操作。
- 临时解决:加
su root root(或对应服务用户,如su www-data www-data) - 长期建议:收紧父目录权限,例如
chmod 0755 /opt/app/logs
压缩后文件名和解压查看要注意
启用 compress 后,归档文件会变成 access.log-1.gz(或带 dateext 的 access.log-20260908.gz)。别直接 cat,得用 zcat、zless 或先 gunzip -c。
另外,高频小日志(比如每秒一条 debug 日志)开 compress 可能反而拖慢 I/O,且解压查问题多一步;这种场景更推荐关压缩、靠 rotate 控制份数 + 定期人工清理。











