Linux日志轮转防止磁盘占满:Linux日志轮转配置详解
服务器跑了一段时间后,你可能会突然发现磁盘满了,网站打不开,SSH 连不上。
用 df -h 一看,/var 目录占用超高——十有八九是日志文件把磁盘撑爆了。Linux 日志轮转就是专门解决这个问题的:让日志按天、按大小自动分割,并删除或压缩旧日志,防止日志文件无限增长。
本文从零开始,教你配置 logrotate,彻底避免日志占满磁盘的尴尬。
先确认当前磁盘与日志情况
在动手配置之前,先明确两个问题:日志文件到底有多大?
logrotate 是否已安装?
- 检查磁盘占用
df -h
看到哪个分区快满了就用 du -sh /var/log/ 看看日志目录大小。
- 检查 logrotate 是否安装
which logrotate
如果返回路径(如 /usr/sbin/logrotate)说明已安装。
CentOS / Ubuntu 默认自带,极少需要手动安装。
若未安装:
- CentOS:
yum install -y logrotate - Ubuntu:
apt install -y logrotate
- 查看当前配置位置
- 主配置文件:
/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 重新打开日志,不能直接重启进程。
测试配置是否生效(不要跳过这一步)
写好的配置一定要先调试,否则可能不轮转或报错。
- 模拟运行(dry-run)
sudo logrotate -d /etc/logrotate.conf
-d 表示调试模式,只模拟不实际轮转。
仔细看输出的最后部分是否提示 rotating pattern 和 next log。
如果出现 error 会明确标出。
- 强制执行
sudo logrotate -f /etc/logrotate.conf
-f 强制轮转,即使还没到周期。
执行后去 /var/log 下查看,应该会出现 messages.1 或 messages.1.gz 等归档文件。
- 检查 crontab 确保自动执行
logrotate 通常由系统 cron 每天触发,文件在 /etc/cron.daily/logrotate。
你不需要手动加入 crontab,只需确认该脚本存在且可执行。
避坑:这几条配置错误最容易被忽略
- 权限问题导致轮转失败:
create指定的用户/组必须对该目录有写权限。如果日志目录是root所属,不要给nobody。出现error: failed to create new log file时,先检查ls -la /var/log/的权限。 - size 值不写单位:必须写
size 100M或size 10G,不能只写数字。 - postrotate 脚本写错:如果不重启对应服务或发错信号,新日志会继续写入旧文件。例如 Nginx 一定用
kill -USR1,不要用restart。 - 忘记 compress 参数:不压缩的归档文件仍然占空间,只是切小了。建议始终加上
compress。 - 手动清空日志文件:绝对不要
> logfile或rm 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 的输出就是最佳排错入口。