为什么需要每天做日志轮转
服务器跑着业务,日志就像行车记录仪,出问题靠它查原因。但时间一长,access.log、error.log这些文件越积越大,动不动几个GB,查看困难,还可能撑爆磁盘。这时候就得靠日志轮转,把大文件切开归档。设置成每天一次,既不会太频繁增加系统负担,又能防止单个日志膨胀。
用logrotate实现每日轮转
Linux系统里最常用的工具是logrotate。它默认按周轮转,但我们可以通过配置改成每天一次。比如Nginx或自定义应用的日志,都可以纳入管理。
先看一个典型的配置文件,路径通常是 /etc/logrotate.d/nginx 或新建一个自己的配置:
/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
}这里面的 daily 就是关键,表示每天检查一次是否需要轮转。搭配 rotate 7,保留最近7天的压缩日志,老的自动删掉,省心又省空间。
怎么确保每天准时执行
logrotate 默认由系统的cron触发,一般在 /etc/cron.daily/logrotate 里。只要这个脚本每天能跑通,配置了 daily 的规则就会生效。可以手动执行测试:
logrotate -d /etc/logrotate.conf-d 是调试模式,不会真改文件,但会输出执行过程,看看有没有报错。如果一切正常,第二天醒来日志就已经切好了。
实际场景中的小坑
有次上线新功能,接口调用量猛增,日志量也跟着翻倍。虽然设了每天轮转,但忘了清理旧的压缩包,结果/var目录还是满了。后来加了监控脚本,定期检查日志目录大小,超过阈值就告警。再就是注意服务信号支持,像Nginx要用 kill -USR1 通知重新打开日志文件,否则新日志还是往旧文件句柄写,轮转白搭。
还有些Java应用自己管日志,比如用Logback,那就得在它的配置里设 <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"/>,配合 maxHistory=7,也能实现每天切一份,保留一周。
小改动,大收益
把日志轮转设成每天一次,操作不难,但对系统稳定性帮助不小。排查问题时,一眼就能定位到某天的某份日志,不用在几十万行里翻。磁盘压力也稳了,再也不会因为一个日志文件突然占满空间导致服务挂掉。这种基础配置,早点设好,后期少踩雷。