logrotate 入门:别让日志文件悄悄撑满云服务器磁盘
服务跑在云服务器上久了,最容易被忽视的问题之一就是日志。应用日志、Nginx 访问日志每天都在增长,几个月后磁盘告警,才发现一个日志文件已经几十 GB。Linux 自带的 logrotate 就是为了解决这个问题:按时间或大小切割日志、压缩旧文件、只保留最近若干份。本文用一个例子讲清楚它的基本用法。
一、logrotate 是怎么运行的
logrotate 本身不是常驻进程,而是由系统定时调用的。大多数发行版通过 cron.daily 或 systemd 的 logrotate.timer 每天执行一次。全局配置在 /etc/logrotate.conf,各个软件自己的规则放在 /etc/logrotate.d/ 目录下,每个文件对应一类日志。
二、写一个最小配置
假设应用把日志写在 /var/log/myapp/*.log,新建 /etc/logrotate.d/myapp:
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 app app
}
daily:每天切割一次,也可以写 weekly 或 monthly。rotate 14:保留 14 份旧日志,更早的自动删除。compress和delaycompress:旧日志用 gzip 压缩,但最近一份暂不压缩,方便直接查看。missingok、notifempty:文件不存在不报错,空文件不切割。create:切割后按指定权限和属主新建日志文件。
三、程序不重新打开文件怎么办
很多程序启动时打开日志文件后一直持有文件句柄。logrotate 把文件改名后,程序仍然往旧文件里写。有两种处理方式:一是用 postrotate 脚本通知程序重新打开日志,例如 Nginx 可以发送 USR1 信号;二是使用 copytruncate,先复制再清空原文件,程序无需任何配合,但在复制和清空之间可能丢失少量日志。
postrotate
systemctl kill -s USR1 nginx.service
endscript
四、按大小切割
如果日志增长很快,可以加上 maxsize 500M,表示即使没到时间,超过 500M 也会切割。注意 logrotate 每天只运行一次,想让大小条件更及时生效,需要把调用频率调高,比如改成每小时执行。
五、先调试再上线
写好配置后,用 logrotate -d /etc/logrotate.d/myapp 以调试模式运行,它只打印将要执行的动作而不真正修改文件。确认无误后,可以用 logrotate -f 强制执行一次,检查生成的文件名和权限是否符合预期。logrotate 的执行状态记录在 /var/lib/logrotate/status 中,排查“为什么没切割”时可以先看这里。
小结
给每个自己部署的服务配一份 logrotate 规则,只需要几行配置,就能让日志保持在可控的大小,避免磁盘被写满导致服务异常。上线前用调试模式检查一遍,再配合磁盘使用率监控,日志问题基本就不用再操心了。
- 点赞
- 收藏
- 关注作者
评论(0)