«

Linux日志过大占满磁盘,logrotate日志切割配置

时间:2026-10-21 07:22     作者:emer     分类: 无


前言

网站跑久了,Nginx、MySQL、PHP-FPM的日志几个G地涨,df -h一看磁盘被日志占满,服务直接报错。手动删不是长久之计,logrotate 是Linux自带的日志切割工具,按天/按大小自动切分并保留指定份数,配一次永久省心。

一、logrotate工作原理

logrotate本身靠系统定时任务(/etc/cron.daily/logrotate)每天跑一次,读取配置:

二、以Nginx日志为例配置

新建 /etc/logrotate.d/nginx:

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

关键点:切割后要给Nginx发USR1信号,让它重新打开日志文件,否则还会往旧文件写。

三、按大小切割(不限时间)

如果日志涨得快,按大小更合理:

/var/log/nginx/error.log {
    size 100M            # 超过100M切
    rotate 10
    compress
    missingok
    notifempty
    create 0644 nginx nginx
    postrotate
        kill -USR1 `cat /run/nginx.pid`
    endscript
}

四、测试与立即执行

不等到定时,手动试运行(调试用 -d 打印过程不真正执行):

# 调试,看会做什么
logrotate -d /etc/logrotate.d/nginx
# 强制立即切割一次
logrotate -f /etc/logrotate.d/nginx

切割后原日志变成 xxx.log-20261021,隔天再压成 .gz。

五、常见坑

  1. 切割后服务还往旧文件写:缺postrotate里的 kill -USR1,或pid路径写错,导致旧文件越来越大;
  2. 直接rm删正在写的日志:空间没释放,要 > 文件 清空或重启服务;
  3. compress和delaycompress一起用仍报错:第一次切出的文件先不压,第二次才压,别误以为没生效;
  4. 日志目录属主不对:create指定的用户组要真实存在,否则新建文件失败;
  5. cron没跑:确认 crond 服务开机自启,否则logrotate永远不触发。

总结

在 /etc/logrotate.d/ 为每个大日志写一份切割规则,配好daily/size、rotate份数和postrotate信号重开日志,logrotate -f 验证一次,磁盘就不会再被单个日志吃满。

遇到问题加QQ23979811 协助处理

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