AlmaLinux 9:给应用日志做轮转
在 almalinux:9 容器(AlmaLinux 9.8)中实际执行:安装 logrotate、写 /etc/logrotate.d/myapp、logrotate -d、logrotate -f、ls -l。日志:plans/content-expansion/evidence/logs/alma-log-rotation.log。
cron.daily 的自动调用、跨天行为、以及 SELinux 上下文相关的失败未在本环境验证。
系统自带的轮转长什么样
Section titled “系统自带的轮转长什么样”ls /etc/logrotate.d/ | head -5head -20 /etc/logrotate.confAlmaLinux 9 自带 btmp、wtmp、dnf 等片段,放在 /etc/logrotate.d/;主配置 /etc/logrotate.conf 只给全局默认。应用配置也放 /etc/logrotate.d/,不要往主配置里塞。
写一个应用片段
Section titled “写一个应用片段”/var/log/myapp/*.log { daily rotate 3 compress missingok notifempty copytruncate}| 指令 | 作用 |
|---|---|
daily | 每天轮转(也可 weekly、size 50M) |
rotate 3 | 保留 3 份历史 |
compress | 轮转后 gzip |
missingok / notifempty | 文件不存在/为空时不报错、不轮转 |
copytruncate | 先复制再清空原文件,应用不用重开句柄 |
预演与强制执行
Section titled “预演与强制执行”sudo logrotate -d /etc/logrotate.d/myappconsidering log /var/log/myapp/app.logCreating new state Now: 2026-10-18 17:54 Last rotated at 2026-10-18 17:00 log does not need rotating (log has already been rotated)-d 只打印,不改文件。确认配置无误后强制执行一次:
sudo logrotate -f /etc/logrotate.d/myappls -l /var/log/myapp/-rw-r--r-- 1 root root 0 Oct 18 17:54 app.log-rw-r--r-- 1 root root 4023 Oct 18 17:54 app.log.1.gz原文件被清空、内容进了 .1.gz——这就是 copytruncate。
copytruncate会丢行:复制与清空之间写入的日志会丢;能重开句柄的应用优先create+postrotate信号;- 只写
size不写时间:size与时间无关,别混用后指望「每天一次」; - 目录属主不对:
copytruncate后新文件属主可能变成 root,需要su myapp myapp。
练习:保留 3 份并验证
Section titled “练习:保留 3 份并验证”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/labsudo logrotate -f /etc/logrotate.d/labls /var/log/lab/检查:
- 存在
a.log.1.gz、a.log.2.gz a.log为 0 字节- 连续强制 5 次后
*.gz不超过 3 个
常见问题
为什么 `logrotate -d` 显示「already been rotated」?
因为它在读状态文件,判断这次不需要轮转;`-d` 只是预演,不会改状态。要立刻验证配置用 `-f` 强制执行一次。
copytruncate 和 create 怎么选?
应用能重新打开日志文件(收到信号后 reopen)就用 create + postrotate;不能重开(比如某些 Java 应用)才用 copytruncate,代价是复制与清空之间可能丢行。
轮转后新文件属主变成 root 了?
copytruncate 由 root 执行,新建文件属主会变。加 `su <user> <group>` 让 logrotate 以应用用户身份处理,或在 postrotate 里 chown。
- 套餐与事务:dnf 事务回滚
- 系统核对:新装系统 7 项核对
- 仓库:AlmaLinux 仓库