logrotate 是 Linux 默认日志轮转工具,通过四步可靠落地:配置独立服务规则、按大小触发轮转、验证配置正确性、理解执行时机与状态记录。

logrotate 是 Linux 系统默认的日志轮转工具,它能自动完成日志切割、压缩、归档和清理,避免日志无限增长导致磁盘占满。配置不复杂,但关键细节容易忽略,掌握以下四步就能可靠落地。
配置独立服务规则(推荐日常做法)
直接在 `/etc/logrotate.d/` 下为你的应用建专属配置文件,不影响全局策略,也方便维护。
比如管理 `/var/log/myapp/app.log`:
- 创建文件:`sudo nano /etc/logrotate.d/myapp`
- 写入内容:
```text
/var/log/myapp/app.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
copytruncate
}
```
其中 `copytruncate` 适合无法重载服务的场景(如某些自研程序),它通过复制+清空原文件实现无中断写入;若服务支持信号重开日志(如 Nginx),可改用 `postrotate ... endscript` 配合 `kill -USR1`。
按大小触发轮转(应对高频率写入)
单纯按天切可能来不及——某次突发流量让单个日志一天涨到 2GB,既难排查又占空间。这时优先用 `size` 控制:
- 把上面配置里的 `daily` 换成 `size 100M`,表示日志超过 100MB 就立即轮转;
- 注意:`size` 和 `daily` 可共存,但 `size` 条件满足时会跳过时间判断,实际生效更快;
- 大小单位支持 `K`、`M`、`G`,例如 `size 500M` 或 `size 2G`。
验证配置是否正确(务必执行)
别等第二天才发现配错了。分两步确认:
- 先调试检查:`sudo logrotate -d /etc/logrotate.d/myapp`
输出会显示“是否匹配文件”“计划怎么重命名”“是否执行 postrotate”,但不真实改动任何文件;
- 再强制运行一次:`sudo logrotate -vf /etc/logrotate.d/myapp`
`-v` 显示详细过程,`-f` 强制执行(无视时间/大小条件),执行后立刻去 `/var/log/myapp/` 看是否有 `app.log.1` 出现。
理解执行时机与状态记录
logrotate 默认由系统每天凌晨通过 `/etc/cron.daily/logrotate` 调用,读取 `/etc/logrotate.conf` 并加载 `/etc/logrotate.d/` 下所有配置。
- 它靠 `/var/lib/logrotate/status` 记录每个日志上次轮转时间,下次执行时据此判断是否满足条件;
- 如果你改了配置但没生效,可查这个状态文件确认时间戳是否更新;
- 临时想改执行时间?不用动 cron,直接修改对应配置里的 `daily`/`weekly`,或把 `/etc/cron.daily/logrotate` 复制到 crontab 里自定义时间点调用即可。