logrotate 是什么
logrotate 负责把日志按计划切割、压缩、清理,默认由系统 cron 里的每日任务或 systemd timer 唤醒。它逐段读取配置,判断是否达到轮转条件,然后重命名旧文件、压缩存档、删除超期文件,必要时执行 postrotate 脚本通知服务重开日志。配置写错有两种典型后果:日志永远不切,磁盘被吃满;或者切了但服务还写旧文件,新建的日志一直是空的。
基本信息
| 适用平台 | Linux 全系,多数发行版默认预装 |
|---|---|
| 驱动方式 | 系统 cron 的每日任务,或 logrotate.timer(systemd 系统) |
| 配置位置 | 主配置 /etc/logrotate.conf,应用片段放 /etc/logrotate.d/ |
| 常用指令 | daily/weekly/monthly、rotate N、size、maxsize、compress、delaycompress、copytruncate、missingok、notifempty、create、postrotate |
典型使用场景
- 新服务上线:为它的日志目录补一份 /etc/logrotate.d/ 片段
- 磁盘被日志吃满:检查是没配轮转,还是 rotate 保留份数太大
- 轮转后新日志为空:服务没重开文件句柄,需要在 postrotate 里 reload
- 临时强制切一次:logrotate -f 立即执行,验证配置是否符合预期
- 排查为什么没切:logrotate -d 干跑,逐行看它的判断依据
应用配置示例
应用配置示例
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 14
maxsize 200M
compress
delaycompress
missingok
notifempty
create 0640 appuser appgroup
sharedscripts
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}调试与强制执行
调试与强制执行
logrotate -d /etc/logrotate.d/myapp # 干跑:打印判断过程,不落盘
logrotate -f /etc/logrotate.d/myapp # 立即强制轮转一次
logrotate -v /etc/logrotate.conf # 详细模式,逐个片段看
cat /var/lib/logrotate/logrotate.status # RHEL 系的状态文件,记录上次轮转时间核心指令
| 指令 | 作用 | 使用提示 |
|---|---|---|
| daily / weekly / monthly | 设定轮转周期 | 与 size 同时写时,谁先满足就用谁 |
| size 100M | 文件达到指定大小才轮转 | 与周期并用可防止突发增长 |
| maxsize 200M | 即使没到周期,超过该值也轮转 | 流量突发的业务常用 |
| rotate N | 保留 N 份旧日志 | 要结合单份大小估算磁盘占用 |
| compress / delaycompress | 压缩旧档 / 延后一轮再压 | delaycompress 与重载服务配合更安全 |
| copytruncate | 复制后截断原文件 | 服务不支持重开时用,有丢日志窗口 |
| create 0640 用户 组 | 轮转后新建文件并设定权限与属主 | 与 copytruncate 不要同时使用 |
| postrotate ... endscript | 轮转后执行的动作 | 常用来让服务重开文件句柄 |
日志切了但新文件一直空着,是服务仍握着旧文件句柄的典型症状;解法是在 postrotate 里 reload 服务,或让应用支持收到指定信号后重开日志。
使用 copytruncate 时,从复制完成到截断之间存在一个窗口,这段时间新写入的日志会丢失;能重开文件的服务优先用 create 加 postrotate。
确认它到底跑没跑
确认它到底跑没跑
grep logrotate /var/log/cron # RHEL 系从守护日志看执行记录
journalctl -u logrotate --since today # systemd timer 驱动时看单元日志
ls -l /var/log/myapp/ # 直接看目录里的文件与时间戳配置里写通配符时,logrotate 会把当前匹配到的所有文件当作一组处理;加上 sharedscripts,postrotate 只执行一次,而不是每个文件都跑一遍。
missingok 与 notifempty 属于防御性指令:前者让文件不存在时不报错,后者让文件为空时跳过轮转。两个都写上,配置在异常情况下才不会频繁刷错误。
rotate 的数字直接决定磁盘占用上限:保留 14 份、单份最大 200M,最坏情况接近 3GB。容量紧张的机器要按这个乘积估算,而不是只看单份大小。
主配置 /etc/logrotate.conf 里的全局指令会被各片段继承,例如默认的 rotate、compress、create;片段里再写一遍即可覆盖。行为不符合预期时,先看全局段再怀疑片段。
日志轮转不等于备份:rotate 只保留最近若干份,超期即被删除。有合规留存要求的日志,需要在轮转之外单独归档到对象存储或备份系统。
验证配置是否真正生效,可靠做法是强制执行一次轮转,然后检查生成的文件名、属主与权限,再确认服务被正确通知;干跑模式只检查语法与命中的文件,不会执行轮转后的动作,用它验证重载逻辑会得到错误结论。轮转后文件的属主与权限取决于配置,收得比原文件更松会让日志被意外读取。