Logrotate 日志轮转实战:让服务器日志不再撑爆磁盘
很多服务器故障的起因都平平无奇——磁盘被日志写满了。Nginx、应用服务每天都在追加日志,几个月下来单个日志文件轻松突破几十 GB,轻则服务异常,重则系统只读宕机。本文介绍 Linux 自带的 logrotate 工具,用几分钟配置实现日志自动轮转、压缩和清理。
一、logrotate 是什么
logrotate 是几乎所有 Linux 发行版预装的日志管理工具。它可以按天、按周或按大小切割日志,旧日志压缩归档,超过保留数量的自动删除,全程无需人工干预,是服务器运维的“基础卫生”工具。
二、快速上手:给 Nginx 日志加轮转
配置文件放在 /etc/logrotate.d/ 目录下,以 Nginx 为例新建一个 nginx 文件,内容如下:
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0644 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
三、常用指令解释
- daily / weekly / monthly:轮转周期,也可以用 size 100M 按大小轮转。
- rotate 14:保留 14 个历史文件,超出数量的自动删除。
- compress / delaycompress:压缩旧日志;delaycompress 延迟一次压缩,方便排查最近的问题。
- missingok:日志文件不存在也不报错;notifempty:空文件不轮转。
- create:轮转后创建新日志文件,并指定权限和属主。
- copytruncate:直接清空原文件而不是重命名,适合无法重新打开日志文件的程序,但有极小概率丢失几行日志。
- postrotate / endscript:轮转后执行的命令,常用来通知服务重新打开日志文件。
四、测试配置是否正确
不要等到第二天才发现配错了,用 debug 模式预演一次:
logrotate -d /etc/logrotate.d/nginx
加上 -f 参数可以强制立即执行一次,亲眼验证轮转效果。
五、它是怎么定时运行的
logrotate 本身不驻留进程,由 cron 每天调用一次(/etc/cron.daily/logrotate),所以 daily 是最小粒度。如果需要更细的粒度,可以在 cron 里加一条每小时执行的任务。
六、常见坑
1. 服务没有重新打开日志:文件重命名后,进程还在往旧文件(已改名)里写,磁盘空间不释放。务必用 postrotate 发信号通知服务,或改用 copytruncate。
2. 通配符路径写错:/var/log/*.log 和 /var/log/*/*.log 差别很大,配完先用 -d 检查实际匹配了哪些文件。
3. 权限问题:create 指定的用户必须对日志目录有写权限,否则轮转后新日志写不进去。
结语:logrotate 配置简单却极其实用,几乎零成本。花十分钟配好,换来的是再也不用半夜爬起来清理磁盘,建议每台 Linux 服务器都做一遍。
- 点赞
- 收藏
- 关注作者
评论(0)