在 Linux 中,**日志轮转(log rotation)**通常通过 logrotate 工具来配置。下面从「基本概念 → 配置方式 → 常见示例 → 调试命令」给你一个清晰说明。
/etc/logrotate.conf/etc/logrotate.d/cron / systemd timer 调用weekly
rotate 4
create
dateext
compress
含义:
weekly:每周轮转rotate 4:保留 4 个旧日志create:创建新日志文件dateext:使用日期作为后缀compress:压缩旧日志在 /etc/logrotate.d/ 下新建文件,例如:
/etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 nginx nginx
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1
endscript
}
说明:
daily:每天轮转missingok:日志不存在不报错notifempty:空文件不轮转delaycompress:延迟一次压缩postrotate:轮转后执行命令/opt/app/logs/app.log {
size 100M
rotate 5
compress
copytruncate
}
说明:
size 100M:超过 100M 就轮转copytruncate:拷贝后清空原文件(适合不能重载的服务)| 参数 | 作用 |
|---|---|
| daily / weekly / monthly | 轮转周期 |
| rotate N | 保留 N 个历史日志 |
| compress | 压缩旧日志 |
| delaycompress | 延迟压缩 |
| copytruncate | 拷贝并清空 |
| create | 创建新日志文件 |
| missingok | 日志缺失不报错 |
| notifempty | 空日志不轮转 |
| postrotate / endscript | 轮转后执行脚本 |
# 模拟执行(不真正轮转)
logrotate -d /etc/logrotate.d/nginx
# 强制立即执行
logrotate -f /etc/logrotate.d/nginx
❌ 服务不重载 → 日志还在写旧文件
✅ 用 postrotate 或 copytruncate
❌ 权限不对 → 新日志无法写入
✅ 用 create 0640 user group
如果你有 具体服务(如 Java / Docker / systemd) 或 想按大小/时间混合策略,可以告诉我,我可以直接帮你写一份配置。