logrotate 实战:copytruncate 与 -f 的坑(Rocky 9 实测)
什么时候该用它
Section titled “什么时候该用它”应用自己写的日志不会自动切分,几天就把分区写满。logrotate 是 EL 自带的轮转工具:按时间或大小切分、压缩、保留 N 份。本页用一个自建应用日志跑完整流程。
装好并看默认配置
Section titled “装好并看默认配置”sudo dnf install -y logrotatehead -20 /etc/logrotate.confls /etc/logrotate.d/ | head -5btmpdnfwtmp/etc/logrotate.d/ 下每个文件是一个配置片段;系统自带的 btmp、wtmp 就在这里。不要改 logrotate.conf 去塞应用配置,放 /etc/logrotate.d/ 更清晰。
给应用写一个片段
Section titled “给应用写一个片段”cat | sudo tee /etc/logrotate.d/myapp <<'EOF'/var/log/myapp/*.log { daily rotate 3 compress missingok notifempty copytruncate}EOF六个指令的含义:
| 指令 | 作用 |
|---|---|
daily | 每天轮转一次(也可 size 50M、weekly) |
rotate 3 | 保留 3 份历史,第 4 份起删除 |
compress | 轮转后 gzip |
missingok | 日志不存在不报错 |
notifempty | 空文件不轮转 |
copytruncate | 先复制再清空原文件,应用不需要重开文件句柄 |
先预演,再强制轮转
Section titled “先预演,再强制轮转”sudo logrotate -d /etc/logrotate.d/myapprotating pattern: /var/log/myapp/*.log after 1 days (3 rotations)empty log files are not rotated, old logs are removedconsidering log /var/log/myapp/app.log... log does not need rotating (log has already been rotated)-d 是 dry-run,只打印不执行。确认配置没问题后强制跑一次:
sudo logrotate -f /etc/logrotate.d/myappls -l /var/log/myapp/-rw-r--r-- 1 root root 0 Oct 18 15:44 app.log-rw-r--r-- 1 root root 4023 Oct 18 15:44 app.log.1.gzapp.log 被清空成 0 字节、内容进了 app.log.1.gz——这就是 copytruncate 的效果。
EL10 实测:同一配置在 Alma/Rocky 10.2 上
Section titled “EL10 实测:同一配置在 Alma/Rocky 10.2 上”在 PVE 的 AlmaLinux 10.2 与 Rocky Linux 10.2 虚拟机里,用同一份片段实测:
/var/log/lab/app.log { daily rotate 3 copytruncate notifempty missingok su root root}logrotate -d 预演(状态文件说当天已轮转过):
log does not need rotating (log has already been rotated)logrotate -f 强制轮转后:
-rw-r--r--. 1 root root 0 ... app.log-rw-r--r--. 1 root root 21 ... app.log.1再写一行、再强制轮转:
-rw-r--r--. 1 root root 0 ... app.log-rw-r--r--. 1 root root 5 ... app.log.1-rw-r--r--. 1 root root 21 ... app.log.2copytruncate 的效果很清楚:原文件被截断为 0,旧内容进 .1,再轮转时 .1 顺延为 .2。好处是写入进程不用重开文件;代价是「复制完到截断之间」有极短窗口,可能丢几行。
copytruncate会丢日志:复制与清空之间写入的行会丢;能重开文件句柄的应用优先用create+postrotate发信号;- 只写
size不写daily:size触发与时间无关,别把两者混用还指望「每天一次」; - 权限:
/var/log/myapp属主不是 root 时,copytruncate后新建文件可能属主不对,必要时加su myapp myapp。
练习:让轮转保留 3 份并验证
Section titled “练习:让轮转保留 3 份并验证”前置:Rocky 9,已安装 logrotate。
sudo mkdir -p /var/log/lab && sudo sh -c 'head -c 200000 /dev/urandom > /var/log/lab/a.log'sudo tee /etc/logrotate.d/lab >/dev/null <<'EOF'/var/log/lab/*.log { daily rotate 3 compress copytruncate }EOFsudo logrotate -f /etc/logrotate.d/lab # 第 1 次sudo logrotate -f /etc/logrotate.d/lab # 第 2 次ls /var/log/lab/检查:
- 存在
a.log.1.gz、a.log.2.gz a.log大小为 0- 连续强制 5 次后,
*.gz不超过 3 个(rotate 3生效)