Linux日志轮转防止磁盘占满:Linux日志轮转配置详解

服务器跑了一段时间后,你可能会突然发现磁盘满了,网站打不开,SSH 连不上。
df -h 一看,/var 目录占用超高——十有八九是日志文件把磁盘撑爆了。Linux 日志轮转就是专门解决这个问题的:让日志按天、按大小自动分割,并删除或压缩旧日志,防止日志文件无限增长。
本文从零开始,教你配置 logrotate,彻底避免日志占满磁盘的尴尬。

先确认当前磁盘与日志情况

在动手配置之前,先明确两个问题:日志文件到底有多大?
logrotate 是否已安装?

  1. 检查磁盘占用
   df -h

看到哪个分区快满了就用 du -sh /var/log/ 看看日志目录大小。

  1. 检查 logrotate 是否安装
   which logrotate

如果返回路径(如 /usr/sbin/logrotate)说明已安装。
CentOS / Ubuntu 默认自带,极少需要手动安装。
若未安装:

  • CentOS:yum install -y logrotate
  • Ubuntu:apt install -y logrotate
  1. 查看当前配置位置
  • 主配置文件:/etc/logrotate.conf
  • 子配置目录:/etc/logrotate.d/(每个服务单独一个文件,如 nginx、rsyslog)

logrotate 核心配置参数解读

logrotate 的配置按“服务名”为单位,常用参数如下(建议花两分钟理解,之后配置就很简单):

  • daily / weekly / monthly:轮转周期。
  • rotate N:保留最近 N 个轮转后的归档文件。
  • size SIZE:日志文件达到指定大小(如 100M)时轮转,优先级高于周期。
  • compress:对旧日志进行 gzip 压缩。
  • delaycompress:推迟一次压缩,防止刚轮转的文件还在写入。
  • missingok:日志文件不存在也不报错。
  • notifempty:日志为空则不轮转。
  • create 644 root root:轮转后新建同名日志文件,并设置权限。

动手配置一条日志轮转规则

以最常见的 rsyslog 系统日志为例,写一个配置防止 /var/log/messages/var/log/syslog 无限增长。

操作路径(二选一)

  • 直接编辑 /etc/logrotate.conf(不推荐,建议每个服务单独文件)
  • /etc/logrotate.d/ 下新建文件,例如 myservices

创建一个新配置文件:

sudo vim /etc/logrotate.d/myservices

写入以下内容(覆盖常见的系统日志):

/var/log/syslog
/var/log/messages
/var/log/kern.log
{
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 syslog adm
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

参数说明:每天轮转一次,保留最近 7 个归档,压缩旧日志,缺失或为空不报错。
轮转后执行 postrotate 脚本让 rsyslog 重新打开日志文件。

如果是 Nginx 日志,可以单独写一个文件 /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

注意:Nginx 信号是 USR1 重新打开日志,不能直接重启进程。

测试配置是否生效(不要跳过这一步)

写好的配置一定要先调试,否则可能不轮转或报错。

  1. 模拟运行(dry-run)
   sudo logrotate -d /etc/logrotate.conf

-d 表示调试模式,只模拟不实际轮转。
仔细看输出的最后部分是否提示 rotating patternnext log
如果出现 error 会明确标出。

  1. 强制执行
   sudo logrotate -f /etc/logrotate.conf

-f 强制轮转,即使还没到周期。
执行后去 /var/log 下查看,应该会出现 messages.1messages.1.gz 等归档文件。

  1. 检查 crontab 确保自动执行

logrotate 通常由系统 cron 每天触发,文件在 /etc/cron.daily/logrotate
你不需要手动加入 crontab,只需确认该脚本存在且可执行。

避坑:这几条配置错误最容易被忽略

  1. 权限问题导致轮转失败create 指定的用户/组必须对该目录有写权限。如果日志目录是 root 所属,不要给 nobody。出现 error: failed to create new log file 时,先检查 ls -la /var/log/ 的权限。
  2. size 值不写单位:必须写 size 100Msize 10G,不能只写数字。
  3. postrotate 脚本写错:如果不重启对应服务或发错信号,新日志会继续写入旧文件。例如 Nginx 一定用 kill -USR1,不要用 restart
  4. 忘记 compress 参数:不压缩的归档文件仍然占空间,只是切小了。建议始终加上 compress
  5. 手动清空日志文件:绝对不要 > logfilerm logfile 后新建,这样会破坏日志文件句柄,导致进程继续向已删除的 inode 写入。必须通过 logrotate 或 truncate

效果验证:查看磁盘占用是否回落

配置生效后等待一次轮转,或者强制轮转后执行:

du -sh /var/log/
df -h /

和之前的数据对比,如果占用明显下降说明配置成功。
也可以查看 less /var/log/messages.1.gz 确认归档正常。

日志轮转是服务器运维的基本功,配置一次长期有效。
如果你使用宝塔面板,可以在“计划任务”中添加一条 logrotate -f /etc/logrotate.conf 手动触发,但本质上底层仍是 logrotate。
掌握本文的方法,即使环境发生变化也能自主排查。

如果你在配置中遇到 logrotate configuration error
请先检查配置文件语法:logrotate -d /etc/logrotate.conf 的输出就是最佳排错入口。

分享到:
上一篇
Linux服务器磁盘IO瓶颈优化
下一篇
Linux用户权限分级隔离配置:从零实现安全隔离
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意