logrotate 是最稳定通用的按天归档压缩方案,通过 daily、rotate 30、compress 等指令实现日志轮转与压缩,配合 postrotate 重载服务,并支持 cronolog 等工具精准零点切分及脚本扩展上传清理。

按天自动归档与压缩日志文件,核心是“先切分、再归档、最后压缩清理”,不依赖复杂工具,Linux 自带的 logrotate 就能完整实现,配合简单脚本还可扩展上传或异常跳过等能力。
用 logrotate 实现按天轮转+压缩
这是最稳定、最通用的方式,适用于 Nginx、Apache、MySQL、自定义应用日志等。
- 在 /etc/logrotate.d/ 下新建配置文件(如
myapp),内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 myuser mygroup
sharedscripts
postrotate
systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}
-
daily:每天零点触发轮转(实际执行时间由/etc/cron.daily/logrotate控制) -
rotate 30:保留最近 30 个归档,超出自动删除 -
compress+delaycompress:旧日志用 gzip 压缩,但当天刚轮出的不压,避免服务还在读写 -
postrotate中 reload 服务,确保新日志写入正确文件
手动控制归档时间(精准零点切分)
若需严格按日界线(如 00:00)生成新文件,logrotate 的定时机制可能有延迟。此时可改用进程内切分工具:
-
cronolog:适合 Apache/Nginx,通过管道实时命名,如:
CustomLog "|/usr/bin/cronolog /var/log/httpd/access_%Y%m%d.log" combined - rotatelogs(Apache 自带):支持时区偏移,但滚动起点是服务启动时刻,非绝对零点
- 切分后,仍可用 logrotate 管理这些已命名的文件(例如匹配
/var/log/httpd/access_*.log),统一压缩归档
补充自动化:归档后打包上传或清理异常
logrotate 不处理云存储或异常跳过,需额外脚本配合 Cron:
- 每日凌晨执行 shell 脚本,扫描
/var/log/myapp/下昨日生成的*_$(date -d 'yesterday' +%Y%m%d).log - 用
zip -9或gzip单独压缩,加时间戳命名(如access_20260812.log.gz) - 检测文件是否正在被写入(
lsof | grep filename),跳过活跃日志,防止损坏 - 上传到 OSS/S3 后,用
find /path -name "*.gz" -mtime +30 -delete清理本地旧包
验证与调试技巧
配置写完别直接上线,先测试:
- 语法检查:
logrotate -d /etc/logrotate.d/myapp(-d 是 debug 模式,只模拟不执行) - 强制立即执行:
logrotate -f /etc/logrotate.d/myapp,观察文件是否重命名、压缩、权限是否正确 - 查看状态记录:
cat /var/lib/logrotate/status,确认上次轮转时间是否符合预期











