logrotate是linux下标准日志轮转工具,通过/etc/logrotate.conf或/etc/logrotate.d/配置实现自动切割、压缩、保留与清理;支持按时间(daily)、大小(size 100m)或两者结合触发,关键参数包括rotate、compress、delaycompress、maxage等,并需配合postrotate重载服务、定期验证与监控。

Linux系统日志长期积累会占用大量磁盘空间,尤其在生产环境中,需通过自动化机制定期清理旧日志,同时保留必要历史记录。核心思路是:用logrotate做轮转管理,配合合理配置实现自动压缩、归档与删除,避免手动干预和磁盘爆满风险。
使用logrotate实现日志轮转与自动清理
logrotate是Linux下最标准、最可靠的日志管理工具,无需额外脚本即可完成切割、压缩、保留周期和清理等全流程。
- 配置文件通常位于
/etc/logrotate.conf(全局)或/etc/logrotate.d/目录下(按服务单独配置) - 关键参数说明:
daily/weekly/monthly:指定轮转频率
rotate N:保留N个归档版本(如rotate 7表示保留最近7份)
compress:启用gzip压缩,节省空间
missingok:日志文件不存在时不报错
notifempty:空文件不轮转
create mode owner group:轮转后重建日志文件并设置权限和属主 - 示例(为
/var/log/app/*.log配置):
/var/log/app/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0644 root root
sharedscripts
postrotate
if [ -f /var/run/syslogd.pid ]; then
kill -HUP `cat /var/run/syslogd.pid`
fi
endscript
}
按大小触发轮转(适用于高写入日志)
某些服务日志增长极快(如API访问日志),仅靠时间轮转可能单个文件已超GB。此时应启用size参数,实现“达量即切”。
- 支持单位:
size 100M、size 1G(注意大小写敏感,m无效) - 可与
daily共存:满足任一条件即触发轮转 - 建议搭配
maxage(如maxage 30)确保即使未轮转的旧文件也会被清理,防止遗漏
清理过期归档与特殊日志路径处理
logrotate默认只清理它自己生成的归档(如app.log.1.gz),但以下情况需额外关注:
-
journald日志:systemd日志需单独控制,执行
journalctl --disk-usage查看占用,用journalctl --vacuum-size=500M或--vacuum-time=2weeks清理 -
第三方应用自建日志:若程序直接写
/data/logs/且不走syslog,需在/etc/logrotate.d/中为其新增配置,或用find+cron辅助清理(仅作补充,不替代logrotate) -
清理残留未压缩旧档:如配置了
delaycompress,需确认rotate值足够覆盖压缩延迟周期,避免.1文件堆积
验证与日常维护要点
配置生效前务必测试,避免误删或轮转失败。
- 用
logrotate -d /etc/logrotate.conf进行dry-run调试(-d显示过程,-v显示详情) - 检查
/var/lib/logrotate/status确认最后轮转时间是否更新 - 定期用
df -h /var和du -sh /var/log/* | sort -hr | head -10监控日志目录增长趋势 - 对关键服务(如nginx、tomcat),建议在logrotate配置中加入
postrotate重载指令,确保新日志文件被服务识别










