logrotate通过按时间或大小轮转日志,压缩并删除旧文件,结合daily、rotate、compress等参数及copytruncate或postrotate机制,实现nginx和tomcat等服务的日志管理,避免磁盘空间耗尽。

linux系统中日志文件会随着时间不断增长,如果不加以管理,可能占用大量磁盘空间,甚至影响系统性能。logrotate 是 Linux 下用于自动轮转、压缩和清理日志文件的工具,支持按大小、时间(如每天、每周)等条件进行切割,并可针对不同服务做独立配置。
logrotate 基本工作原理
logrotate 通常由 cron 每天自动执行,读取配置文件判断哪些日志需要处理。它能完成以下操作:
- 移动或重命名旧日志文件(轮转)
- 创建新的空日志文件供服务写入
- 压缩历史日志节省空间
- 删除超过保留期限的日志
- 在轮转前后执行自定义脚本(如重启服务)
配置文件一般位于:
– 主配置文件:/etc/logrotate.conf
– 配置片段目录:/etc/logrotate.d/(推荐将各服务配置放在此目录下)
按服务名切割日志的配置方法
以常见的 Nginx 和 Tomcat 为例,展示如何为特定服务设置独立的日志切割策略。
1. 为 Nginx 配置日志切割
创建配置文件:
写入如下内容:
/var/log/nginx/*.log { daily missingok rotate 7 compress delaycompress notifempty create 0644 www-data adm sharedscripts postrotate systemctl reload nginx > /dev/null 2>&1 || true endscript }
参数说明:
- daily:每天轮转一次
- missingok:日志不存在时不报错
- rotate 7:最多保留7个旧日志(即 log.1 到 log.7.gz)
- compress:使用 gzip 压缩旧日志
- delaycompress:延迟压缩,最新一轮不立即压缩(常与 compress 配合使用)
- notifempty:日志为空时不轮转
- create 0644 www-data adm:轮转后创建新日志文件,权限为 0644,属主 www-data,属组 adm
- sharedscripts:所有日志只执行一次 postrotate 脚本
- postrotate … endscript:轮转完成后重新加载 Nginx,使其指向新日志文件
2. 为 Tomcat 配置日志切割
Tomcat 日志通常位于 /opt/tomcat/logs/,比如 catalina.out。
创建配置文件:
vim /etc/logrotate.d/tomcat
内容如下:
/opt/tomcat/logs/catalina.out { copytruncate daily rotate 30 compress missingok notifempty size 100M }
关键点说明:
- copytruncate:复制日志后清空原文件,适用于无法重载进程的服务(如 Tomcat 后台运行不输出到 syslog)
- size 100M:当日志超过 100MB 时立即触发轮转,无论是否到“每天”时间点
- 没有 postrotate 脚本,因为使用 copytruncate 不需要通知服务
⚠️ 注意:copytruncate 有一定风险,在复制和截断之间可能丢失少量日志,但对大多数场景可接受。
测试与调试 logrotate 配置
配置完成后,建议先手动测试,避免正式运行出错。
1. 模拟运行(查看会做什么):
logrotate -d /etc/logrotate.d/nginx
-d 表示 debug 模式,不会真正执行操作,仅输出计划行为。
2. 强制执行一次轮转(测试实际效果):
logrotate -f /etc/logrotate.d/nginx
-f 表示强制轮转,可用于验证配置是否生效。
3. 查看状态信息:
logrotate 记录上次处理时间的状态文件在:
/var/lib/logrotate/status
可用命令查看:cat /var/lib/logrotate/status
常见问题与优化建议
服务未重新加载导致日志仍写入旧文件?
确保在 postrotate 中正确发送信号或 reload 服务。例如 apache 使用 reload,java 应用若支持 SIGHUP 可用 kill -HUP。
想按周或每月切割?
替换 daily 为 weekly 或 monthly 即可。
想同时满足时间和大小条件?
可以并列使用,只要任一条件满足就会触发轮转。例如既有 daily 又有 size 100M。
多个服务共用一个日志目录怎么办?
可在配置中列出多个路径,或使用通配符,但建议每个服务单独配置,便于维护。
基本上就这些。合理利用 logrotate,能让系统日志整洁有序,避免磁盘被撑爆。关键是根据服务特点选择 copytruncate 还是 postrotate 方式,并定期检查配置是否生效。