logrotate 是什么
logrotate 负责给日志做轮转:按周期把当前日志改名归档、按保留份数删掉最旧的、可选压缩,并创建新的空文件让应用继续写。应用自己写文件、不接管日志系统的场景都靠它,否则一个日志文件迟早能把分区写满。规则以单独文件放在 /etc/logrotate.d/ 下,由定时机制每天触发一次;写规则时除了轮转参数,还要考虑新文件的属主权限和让应用重新打开文件,否则轮转后应用可能写不进去。
基本信息
| 规则目录 | /etc/logrotate.d/ 下的独立规则文件 |
|---|---|
| 触发方式 | 由系统定时机制每日触发,具体单元视发行版而定 |
| 状态文件 | 记录上次轮转时间,位置因发行版而异 |
| 常用动作 | 续期轮转、按周期轮转、压缩归档、限制保留份数 |
| 权限 | 改规则与强制执行需 root |
| 适用平台 | Kylin V10 / UOS / openEuler 均预装 |
典型使用场景
- 自研应用日志治理:应用自己写文件且不做轮转,交给系统统一管理
- 控制磁盘占用:限制保留份数与压缩归档,避免日志无限增长
- 审计留存:按合规要求设定保留周期,兼顾容量
- 压缩冷日志:老文件自动压缩,节省空间同时保留可查性
- 轮转后平滑续写:配合应用重载或截断方式保证继续写入
- 排障验证:用演练模式确认规则行为,避免直接生效造成意外
规则示例
规则示例
/var/log/myapp/*.log { # 匹配要轮转的日志文件
daily # 每天轮转一次
rotate 14 # 保留 14 份归档
compress # 老文件压缩
delaycompress # 最近一份先不压,避免应用仍持有
missingok # 文件不存在不算错误
notifempty # 空文件不轮转
create 0640 appuser appuser # 新建文件的属主与权限
sharedscripts # 匹配多个文件时脚本只跑一次
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}手动验证
手动验证
logrotate -d /etc/logrotate.d/myapp # 演练:只打印将要执行的动作
logrotate -f /etc/logrotate.d/myapp # 强制执行一次
ls -lh /var/log/myapp/ # 核对归档与新文件是否出现
journalctl -u myapp -n 30 --no-pager # 确认应用轮转后仍正常写日志常用指令读法
| 指令 | 作用 | 使用提示 |
|---|---|---|
| daily / weekly | 轮转周期 | 按日志增长速度选择 |
| rotate 份数 | 保留归档数量 | 结合留存要求与容量计算 |
| compress | 压缩归档文件 | 节省空间,查询时需解压 |
| delaycompress | 延迟压缩最近一份 | 适合应用可能仍持有文件的情况 |
| missingok | 文件不存在不报错 | 避免因日志暂未生成而告警 |
| create 权限 | 轮转后新建文件 | 属主与权限写错会导致应用写不进去 |
| sharedscripts | 脚本只执行一次 | 匹配多个文件时必要 |
| copytruncate | 复制后截断原文件 | 会丢少量行,优先让应用重开文件 |
轮转之所以要通知应用,是因为进程持有的是文件句柄:日志文件被改名后,进程仍在写旧文件,新文件空着,看起来像日志丢了。让应用重载或重开文件是首选做法;应用确实不支持重开时,才考虑先复制再截断原文件的方案。
修改规则后不要直接等定时触发,先用演练模式看一遍将要执行的动作,再手工强制执行一次确认文件权限与续写都正常。不验证就上线,最常见的后果是应用轮转后再也写不进日志,问题往往隔天才被发现。