日志轮转解决什么
日志轮转控制单个日志文件的大小与历史份数:logrotate 按天或按大小切分旧文件,压缩后保留 N 份,超出部分删除。它解决的是磁盘被日志写满这类问题,同时决定采集器能读到多少历史数据,因此轮转策略要和日志采集范围一起设计。
基本信息
| 执行方式 | 由 cron 或 systemd timer 定期调用 logrotate |
|---|---|
| 配置文件 | /etc/logrotate.conf 与 /etc/logrotate.d/ 下的分片 |
| 切换方式 | create(重命名后建新文件)与 copytruncate(复制后清空) |
| 保留策略 | rotate 指定份数,配合 compress、dateext 使用 |
logrotate 配置示例
logrotate 配置示例
/var/log/app/*.log {
daily # 每天轮转一次
rotate 7 # 保留 7 份历史
compress # 压缩历史文件
delaycompress # 最近一份先不压缩
missingok # 文件不存在不报错
notifempty # 空文件不轮转
create 0640 app app
}参数含义
| 参数 | 含义 | 注意点 |
|---|---|---|
| daily / weekly | 轮转周期 | 也可用 size 按体积触发 |
| rotate N | 保留的历史份数 | 份数乘以单文件大小决定磁盘占用 |
| compress | 压缩历史文件 | delaycompress 让最近一份保持可读 |
| create | 轮转后新建文件与权限 | 应用需要重新打开文件句柄 |
| copytruncate | 复制后清空原文件 | 存在竞态窗口,可能丢行 |
典型使用场景
- 业务日志持续增长,需要限定单文件大小与保留时间
- 采集器要保证窗口内的日志都能读到,轮转份数不能少于采集滞后时间
- 按天归档便于事后检索,用 dateext 让文件名带上日期
- 磁盘告警频发时先检查日志目录的轮转是否真正生效
应用自己能重新打开文件时优先用 create 式轮转;只能 copytruncate 时,要和采集器的读取行为一起验证是否出现丢行。
新配置先用 logrotate -d 做 dry-run 验证,再实际执行,避免参数写错一次性清掉必需的历史日志。
排查要点
- 轮转没生效先确认 cron 或 timer 是否在跑,再检查配置路径是否被正确加载
- 对比新老文件的属主与权限,create 参数写错会让应用写不进新文件
- 轮转后日志在采集端重复或断档,检查采集器与轮转方式的配合是否合理