为什么需要每天轮转日志
在服务器运维或应用开发中,日志文件很容易越积越大。比如一个电商后台系统,用户每下一单、每查一次订单,都会写入日志。如果不加控制,几天下来日志可能就达到几个GB,查找问题时打开都费劲,还可能占满磁盘导致服务异常。
“日志轮转每天一次”就是一种简单有效的管理方式——每天生成一个新的日志文件,旧的日志归档或压缩保存,既方便按天排查问题,又能控制磁盘使用。
用 logrotate 实现每日轮转
Linux 系统中,logrotate 是最常用的日志轮转工具。它默认由 cron 每天触发一次,正好契合“每天轮转”的需求。
假设你的应用日志位于 /var/log/myapp.log,可以创建一个配置文件 /etc/logrotate.d/myapp:
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 644 www-data www-data
}这段配置的意思是:每天轮转一次,保留最近7天的日志,自动压缩以节省空间。如果当天没有日志输出,也不报错;每次轮转后自动创建新的空文件,并设置好权限。
配合 Nginx 或自定义服务使用
很多服务如 Nginx 本身就支持这种模式。比如 Nginx 的日志轮转配置也类似:
/var/log/nginx/*.log {
daily
rotate 10
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}这里的 postrotate 脚本会在轮转完成后重新加载 Nginx,确保它开始往新文件写日志。否则 Nginx 还会继续往旧的文件句柄写,即使文件被重命名了。
自己写的脚本怎么接入
如果你是一个 Python 脚本天天跑任务,也可以手动配合 logrotate。只要保证你的程序能接受信号重启,或者使用 RotatingFileHandler 这类自带轮转的模块。
更简单的做法是,让脚本每次都往固定名字的文件写日志,比如 app.log,然后靠外部的 logrotate 每天切一次。这样代码不用改,运维也能统一管理。
验证是否生效
配置完别忘了测试。可以用下面命令模拟一次运行:
logrotate -d /etc/logrotate.d/myapp加上 -d 是调试模式,会打印出实际执行逻辑,但不真正操作。确认没问题后,再用 -f 强制执行一次看看效果:
logrotate -f /etc/logrotate.d/myapp第二天检查一下目录,应该能看到类似 myapp.log.1 的文件,如果是压缩的,可能叫 myapp.log.1.gz。
时间一长,你会发现这种“每天一个文件”的习惯特别顺手。查昨天的问题?直接看昨天的文件就行,不用在一堆时间戳里翻来翻去。