在 Linux 中,日志轮转(log rotation)通常由 logrotate 工具管理。下面从原理、配置位置、配置示例、常用参数、调试方法几个方面说明。
logrotate 会按照配置:
通常由 cron / systemd timer 每天执行一次:
/etc/cron.daily/logrotate
# 或
systemctl status logrotate.timer
/etc/logrotate.conf
/etc/logrotate.d/
每个服务一个文件,例如:
/etc/logrotate.d/nginx
/etc/logrotate.d/tomcat
/var/log/myapp.log/var/log/myapp.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 app app
sharedscripts
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
| 参数 | 说明 |
|---|---|
daily / weekly / monthly |
轮转周期 |
size 100M |
日志超过 100M 就轮转 |
rotate 7 |
保留 7 个旧日志 |
compress |
压缩旧日志(.gz) |
delaycompress |
下次轮转再压缩 |
missingok |
日志不存在不报错 |
notifempty |
空日志不轮转 |
create 0640 user group |
创建新日志文件 |
copytruncate |
拷贝后清空原文件(不重命名) |
postrotate ... endscript |
轮转后执行命令 |
适合不能 reopen 日志的进程(如某些 Java、Python 程序):
/var/log/myapp.log {
size 50M
rotate 5
copytruncate
compress
}
⚠ 注意:
logrotate -d /etc/logrotate.d/myapp
-d:debug 模式(不真正执行)logrotate -f /etc/logrotate.d/myapp
/var/log/nginx/*.log {
daily
rotate 14
missingok
compress
delaycompress
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
systemctl reload nginx
endscript
}
/opt/tomcat/logs/catalina.out {
copytruncate
daily
rotate 10
compress
}
cat /var/lib/logrotate/status
create 或 copytruncate如果你有具体服务(nginx / docker / java)或想按大小而不是时间轮转,我可以给你更精确的配置。