知玩指南
白蓝主题五 · 清爽阅读
首页  > 驱动工具

如何设置日志轮转 实用操作步骤与避坑指南

为什么需要日志轮转

你有没有遇到过服务器磁盘突然爆满,查来查去发现是某个服务的日志文件涨到了几十GB?这种情况太常见了。系统或应用在运行过程中会不断写入日志,如果不加控制,时间一长,硬盘就被塞满了。更麻烦的是,大日志文件打开都卡,排查问题反而更费劲。

日志轮转就是解决这个问题的关键——它能自动把当前日志归档,生成新的日志文件,并可设定保留份数和大小限制,避免单个文件无限增长。

使用 logrotate 管理日志

Linux 上最常用的日志轮转工具是 logrotate,大多数发行版默认都自带。它通过配置文件定义规则,配合 cron 定时执行,完全自动化。

比如你想管理 Nginx 的访问日志 /var/log/nginx/access.log,可以写一个配置:

/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
endscript
}

这段配置的意思是:每天轮转一次,保留7份旧日志,压缩归档,如果日志为空就不处理,新文件由 www-data 用户创建,权限为 0640。最关键的是 postrotateendscript 之间的命令,告诉 Nginx 重新打开日志文件,否则它还会往旧文件句柄写。

按大小触发轮转

有些场景不适合按天轮转,比如高并发的 API 服务,一天可能产生几个 GB 日志。这时可以改成按大小触发:

/var/log/app/*.log {
size 100M
rotate 5
compress
missingok
notifempty
create 644 appuser appgroup
postrotate
kill -HUP `cat /run/app.pid`
endscript
}

只要日志文件达到 100MB 就触发轮转,最多保留5份。这样既能控制文件大小,又不会频繁归档。

手动测试配置是否生效

写完配置别急着等明天看效果,可以用命令先试跑一遍:

logrotate -d /etc/logrotate.d/your-config

-d 是调试模式,会输出详细过程但不真正执行。确认没问题后,用 -f 强制运行一次:

logrotate -f /etc/logrotate.d/your-config

看看日志文件是不是被正确切割、压缩,服务是否正常写入新文件。

检查系统定时任务

logrotate 通常由系统每天执行一次,查看 /etc/cron.daily/logrotate 是否存在,确保 cron 服务正在运行。如果你改成了 size 触发,那就得靠这个定时任务不断检查文件大小。

个别情况下,你可以用 crontab 添加更频繁的检查,比如每小时一次:

0 * * * * /usr/sbin/logrotate /etc/logrotate.conf > /dev/null 2>&1

不过要注意性能影响,别让检查本身变成负担。

小技巧:给重要日志加监控

即使设置了轮转,也建议搭配简单的监控脚本。比如每周写个脚本扫一遍日志目录,发现某个文件超过 1GB 就发邮件提醒,防患于未然。运维这事儿,不怕麻烦,怕的是出事才发现没人盯着。