«

Linux日志切割logrotate配置详解

时间:2026-11-15 07:39     作者:emer     分类: 无


服务器跑久了,Nginx、MySQL、PHP 的日志会越滚越大,把磁盘吃到 100%。手动删日志不现实,而且服务还在往旧文件里写。logrotate 是 Linux 自带的日志切割工具,按天或按大小自动归档、压缩、删旧,并通知服务重新打开日志句柄。本文讲清配置位置、关键字段和常见坑。

一、logrotate 工作机制

logrotate 由系统定时任务驱动,通常在 /etc/cron.daily/logrotate 里每天跑一次。它读取 /etc/logrotate.conf 和 /etc/logrotate.d/ 下的配置,对符合条件的日志执行切割、压缩、保留策略。

# 查看默认主配置
cat /etc/logrotate.conf

# 查看各软件独立配置
ls /etc/logrotate.d/

二、一个完整 Nginx 日志配置示例

在 /etc/logrotate.d/nginx 写入:

/var/log/nginx/*.log {
    daily                    # 按天切割
    missingok                # 日志不存在不报错
    rotate 14                # 保留 14 份历史
    compress                 # 旧日志 gzip 压缩
    delaycompress            # 延迟一次再压缩,避免抢写
    notifempty               # 空文件不切割
    create 0640 nginx adm    # 新建日志的权限和属主
    sharedscripts            # 多个日志只执行一次脚本
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

三、常用关键字段说明

四、手动测试配置

改完配置别等明天,先强制跑一遍验证:

# 只检查语法,不真正执行
logrotate -d /etc/logrotate.d/nginx

# 强制执行一次切割
logrotate -f /etc/logrotate.d/nginx

-d 是调试模式,会打印它打算怎么处理但不落盘,排错首选。

五、常见坑

  1. 切割后服务仍往旧文件写:必须在 postrotate 里给 Nginx 发 USR1 信号或 reload,让它重新打开日志文件,否则新日志写进归档。
  2. 压缩和写入冲突:同一次切割立刻压缩正在被写的文件会报错,用 delaycompress 延后一轮。
  3. 路径用通配符 /var/log/nginx/*.log 时,别把已经切割压缩的归档再匹配进去。
  4. rotate 份数设太小,误删还想查的历史;设太大又占磁盘,按业务保留周期定。
  5. 自定义配置文件放错目录:必须在 /etc/logrotate.d/ 下,主配置里要 include 该目录。
  6. 容器内日志不走 logrotate,要用 Docker 日志驱动或应用自身轮转。
  7. 改完没 reload,系统 cron 第二天才生效,紧急时手动 -f 执行。

总结

logrotate 靠「时间或大小触发 + 保留份数 + 压缩 + postrotate 通知服务」解决日志膨胀。配置写在 /etc/logrotate.d/,改完先用 -d 调试、再用 -f 强制执行验证,关键别漏掉切割后让服务重开日志的信号。

遇到问题加QQ23979811 协助处理

标签: Linux运维 logrotate 日志切割 磁盘清理 Nginx日志