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:每天轮转一次。也可用 weeklymonthlysize 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 调高回滚数量或添加压缩。

避坑指南:这几个问题最容易被忽略

  1. 权限不足导致轮转失败

logrotate常由root执行,但如果日志文件属主是其他用户且没有读取权限,会报错。
可以用 sudo logrotate -d /etc/logrotate.d/nginx 调试模式检查权限。

  1. dateext与旧文件冲突

启用 dateext 后,文件名为 name-YYYYMMDD
如果同一天多次轮转(比如手动执行测试),新文件会覆盖旧文件。
建议仅在每日一次的场景下使用。

  1. postrotate脚本未生效

如果忘记配置 sharedscripts,postrotate会对每个日志文件执行一次,导致Nginx收到多次信号。
务必加上 sharedscripts

  1. 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

看到 successrotated 1 files 即表示任务顺利。

如果你正在处理Linux日志轮转防止磁盘爆满的问题,建议先按本文步骤完整执行一遍,再根据实际服务类型微调配置;
遇到权限或脚本报错时,优先回看避坑部分。
养成定期检查日志轮转状态的习惯,就能彻底告别“磁盘爆红”的焦虑。

分享到:
上一篇
Linux SELinux安全策略配置实战教程:从入门到避坑
下一篇
Linux开机自启服务配置详解:新手必看的systemd实战
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意