Linux 服务器日志暴增,如何配置日志轮转?
某天你发现网站变慢或SSH连不上,查了半天才发现是 /var/log 目录把磁盘塞满了。
这就是典型的 服务器日志暴增 问题。
Linux 系统自带的 logrotate 工具可以自动按大小、时间拆分并清理旧日志,下面带你完整配置一遍。
动手前先确认两件事
绝大多数 Linux 发行版已默认安装 logrotate,但最好先确认一下:
rpm -qa | grep logrotate # CentOS/RHEL
dpkg -l | grep logrotate # Ubuntu/Debian
如果没输出,执行安装:
# CentOS
sudo yum install -y logrotate
# Ubuntu
sudo apt install -y logrotate
配置文件一般放在 /etc/logrotate.conf(全局设置),自定义配置推荐放在 /etc/logrotate.d/ 目录下(每个应用一个文件)。
编写你的第一个轮转配置
假设你的应用日志位于 /var/log/myapp/access.log,每天产生几十 MB,且不需要保存太久。
创建一个配置文件:
sudo vim /etc/logrotate.d/myapp
写入以下内容:
/var/log/myapp/access.log {
daily # 每天轮转一次
rotate 7 # 保留最近7个归档
compress # 压缩旧日志(默认gzip)
delaycompress # 推迟一天压缩,方便查看
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 www-data www-data # 轮转后新建日志文件的权限和属主
}
保存后执行一次测试:
sudo logrotate -d /etc/logrotate.d/myapp
-d 是调试模式,只模拟不实际执行,没有报错代表配置生效。
避坑:新手最容易翻车的三个地方
- 权限问题:
create指令的属主或组必须与日志实际写入进程一致,否则轮转后新日志无法写入。可先用ls -l /var/log/myapp/access.log查看原属主。 - 复制截断 vs 创建新文件:应用程序运行时通常持有旧文件句柄。使用
create后旧日志被移动,新文件被创建;部分服务需要额外发送信号(如postrotate指令)才能重新打开日志。例如 Nginx 需要在配置里加:
postrotate
/usr/sbin/nginx -s reopen
endscript
- 时间单位误解:
daily按自然天轮转,size 100M按文件大小触发,两者可以同时使用(一旦某个条件满足就轮转)。如果日志暴增过快,建议同时设置size限制。
验证轮转是否按预期工作
等待一天太慢,我们可以手动强制触发一次:
sudo logrotate -f /etc/logrotate.d/myapp
然后检查 /var/log/myapp/ 目录:
- 原
access.log应被重命名为access.log.1或access.log.1.gz(带压缩后缀)。 - 新
access.log文件已创建,且属主权限与配置一致。
查看 logrotate 执行记录:
cat /var/lib/logrotate/logrotate.status
里面会列出每个日志文件的上次轮转时间,确认 myapp/access.log 已被记录。
最后建议再检查磁盘使用率:
df -h /var/log
如果之前快满了,现在应该已经空出不少空间。
如果你正在处理 Linux 服务器日志暴增,建议先按本文步骤完整执行,根据自己应用的类型调整 postrotate 信号;
遇到异常时优先回看避坑部分,并检查 /var/log/messages 或 journalctl -u logrotate 获取更详细的错误输出。