Nginx、MySQL 等服务持续写日志,时间久了单个文件能大到几十 GB,既影响性能又有撑爆磁盘的风险。logrotate 是解决这个问题的标准工具。
一、logrotate 工作原理
它是系统自带的定时任务(每天由 cron 触发),按配置规则对日志文件做:重命名切割、压缩、保留指定份数、删除过旧的。
二、查看现有配置
ls /etc/logrotate.d/ # 各服务的切割配置
cat /etc/logrotate.d/nginx # 看 nginx 的规则
三、为自定义应用配置
新建 /etc/logrotate.d/myapp:
/var/log/myapp/*.log {
daily # 每天切割
rotate 14 # 保留 14 天
compress # 压缩旧日志
missingok # 日志不存在不报错
notifempty # 空文件不切割
copytruncate # 复制后清空原文件(服务不用重启)
}
四、手动测试
logrotate -d /etc/logrotate.d/myapp # 调试模式(干跑,不实际执行)
logrotate -f /etc/logrotate.d/myapp # 强制立即执行一次
copytruncate 适合不能发送重开日志信号的服务:它复制当前日志后清空原文件,省去重启。但极端情况下可能丢失极少量日志。
五、常见策略
- 访问日志:daily + rotate 30(保留一月)
- 错误日志:weekly + rotate 90(更久)
- 关键审计:monthly + rotate 365(一年)
六、小结
日志管理是运维的基本功。配好 logrotate 后基本一劳永逸,再也不用半夜被"磁盘满了"告警叫醒。