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 适合不能发送重开日志信号的服务:它复制当前日志后清空原文件,省去重启。但极端情况下可能丢失极少量日志。

五、常见策略

六、小结

日志管理是运维的基本功。配好 logrotate 后基本一劳永逸,再也不用半夜被"磁盘满了"告警叫醒。