Linux日志轮转防止磁盘爆满:Linux日志轮转配置指南
为什么日志文件会悄悄占满磁盘?
很多新手运维同学遇到过这种场景:SSH连不上服务器,提示“No space left on device”。
用 df -h 一查,发现 /var/log 目录已经爆红,里面躺着几个几GB的日志文件。Linux日志轮转就是解决这个问题的标准方案——它能把日志按大小或时间自动切割、压缩、删除旧文件,从根源上防止磁盘爆满。
准备条件:确认logrotate已就绪
绝大多数Linux发行版都预装了logrotate。
执行以下命令确认:
logrotate --version
如果提示“command not found”,用包管理器安装:
- Debian/Ubuntu:
sudo apt-get install logrotate - CentOS/RHEL:
sudo yum install logrotate
确认配置文件目录存在:
- 主配置:
/etc/logrotate.conf - 应用配置:
/etc/logrotate.d/目录下的独立文件
logrotate由cron驱动,通常每天执行一次。
检查cron服务是否运行:
systemctl status cron # 或 crond
如果未运行,先启用并启动:
sudo systemctl enable --now cron
手写一份Nginx日志轮转配置
以常见的Web服务器Nginx为例,在 /etc/logrotate.d/ 下新建文件 nginx:
sudo vim /etc/logrotate.d/nginx
写入以下内容:
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
dateext
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
关键参数说明:
daily:每天轮转一次。也可用weekly、monthly或size 100M(按大小)。rotate 7:保留最近7个轮转文件,更早的自动删除。compress:新轮转文件自动gzip压缩,节省空间。delaycompress:跳过最近一个文件的压缩,方便查看。missingok:日志文件缺失时不报错。notifempty:日志为空则不轮转。dateext:文件名追加日期,如access.log-20250331.gz。sharedscripts:所有日志处理完后只执行一次postrotate脚本。postrotate:通知Nginx重新打开日志文件,否则日志会写进旧文件。
如果你用的是系统日志(如 /var/log/syslog),可以直接修改 /etc/logrotate.d/rsyslog 调高回滚数量或添加压缩。
避坑指南:这几个问题最容易被忽略
- 权限不足导致轮转失败
logrotate常由root执行,但如果日志文件属主是其他用户且没有读取权限,会报错。
可以用 sudo logrotate -d /etc/logrotate.d/nginx 调试模式检查权限。
- dateext与旧文件冲突
启用 dateext 后,文件名为 name-YYYYMMDD。
如果同一天多次轮转(比如手动执行测试),新文件会覆盖旧文件。
建议仅在每日一次的场景下使用。
- postrotate脚本未生效
如果忘记配置 sharedscripts,postrotate会对每个日志文件执行一次,导致Nginx收到多次信号。
务必加上 sharedscripts。
- cron未执行logrotate
有时系统cron配置被删除。
检查 /etc/cron.daily/logrotate 是否存在且可执行:
ls -l /etc/cron.daily/logrotate
sudo run-parts /etc/cron.daily # 手动触发当日cron任务
验证轮转是否能正常工作
手动执行logrotate:
sudo logrotate -vf /etc/logrotate.d/nginx
-v:显示详细信息。-f:强制轮转,即使未到期。
执行后检查目录:
ls -lh /var/log/nginx/
你会看到类似 access.log-20250331.gz 的压缩文件,以及一个新鲜的 access.log。
确认定时任务:
查看 /etc/cron.daily/logrotate 内容,确保每天执行。
也可用 run-parts 测试:
sudo run-parts --test /etc/cron.daily | grep logrotate
若输出包含 logrotate,说明cron脚本正常。
查看历史轮转记录:
logrotate每次执行会写日志到 /var/log/logrotate.log(部分系统在messages中)。
检查最后一行:
tail -10 /var/log/logrotate.log
看到 success 或 rotated 1 files 即表示任务顺利。
如果你正在处理Linux日志轮转防止磁盘爆满的问题,建议先按本文步骤完整执行一遍,再根据实际服务类型微调配置;
遇到权限或脚本报错时,优先回看避坑部分。
养成定期检查日志轮转状态的习惯,就能彻底告别“磁盘爆红”的焦虑。