汇知百科
白蓝主题五 · 清爽阅读
首页  > 系统软件

日志轮转每天一次:如何高效管理服务器日志

为什么需要每天做日志轮转

服务器跑着业务,日志就像行车记录仪,出问题靠它查原因。但时间一长,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,也能实现每天切一份,保留一周。

小改动,大收益

把日志轮转设成每天一次,操作不难,但对系统稳定性帮助不小。排查问题时,一眼就能定位到某天的某份日志,不用在几十万行里翻。磁盘压力也稳了,再也不会因为一个日志文件突然占满空间导致服务挂掉。这种基础配置,早点设好,后期少踩雷。