Linux 日志轮转入门:用 logrotate 管住不断长大的日志文件
服务器跑久了,最容易被忽视的问题之一,就是日志文件越长越大。一个应用每天写几百兆日志并不罕见,几个月下来磁盘就被吃掉大半,等到磁盘写满、服务写不进日志甚至写不进数据,问题就已经晚了。日志轮转就是为了解决这个问题:定期把旧日志归档、压缩、删除,让日志文件始终保持在可控的大小。
logrotate 是什么
logrotate 是 Linux 上最常用的日志轮转工具,大多数发行版都自带。它本身不产生日志,只按规则处理已有日志文件:按天、按周或者按大小触发,把当前日志改名归档,再让应用写到一个新文件里。它通常由 cron 每天触发一次,所以规则写好之后基本不用人工干预。
写第一条轮转规则
假设应用日志在 /var/log/myapp/ 下面,可以新建一个配置文件:
/var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
dateext
}
这条规则的意思是:每天轮转一次,最多保留 14 个历史文件,旧文件用 gzip 压缩;如果日志文件不存在也不报错,空文件不轮转;轮转时直接把当前文件内容清空而不是移动文件,这样不用重启应用;归档文件按日期加后缀,方便查找。
copytruncate 和 create 怎么选
这是新手最容易踩的坑。create 是先把旧文件改名,再新建一个同名文件,要求应用重新打开文件句柄;如果应用一直拿着旧文件描述符不放,新日志还会写进已经改名的旧文件里。copytruncate 是把文件内容复制走再清空原文件,应用不用重启、不改句柄,但轮转瞬间可能丢失少量正在写入的日志。对不能随便重启的服务,通常先选 copytruncate;能配合重启或支持信号重载的应用,用 create 加 postrotate 发送信号更干净。
先调试,再上线
规则写完不要直接等第二天看结果。先用调试模式跑一次:
logrotate -d /etc/logrotate.d/myapp
调试模式只打印它会做什么,不会真的动文件。确认无误后,用 -f 强制触发一次,检查归档文件和权限是否符合预期。还要注意一个细节:日志目录的属主和权限要和运行应用的用户一致,否则轮转后新文件写不进去。
日常维护的三个习惯
第一,给每类日志单独建规则文件,不要全塞进全局配置,出了问题好定位。第二,用 maxsize 兜底,比如 daily 加 maxsize 200M,日志暴涨当天就触发轮转,不用等到第二天。第三,定期看一眼磁盘和归档数量,配合备份策略清理过期压缩包,轮转只是控制增量,长期留存还是要靠归档和清理。
把日志轮转当成部署的一部分,而不是出问题后的补救,磁盘告警会少很多,排查问题时也能更快找到对应时间的日志。
- 点赞
- 收藏
- 关注作者
评论(0)