跳转到内容
搜索 AlmaLinux 文档

    浏览当前文档目录

    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 上下文相关的失败未在本环境验证。

    Terminal window
    ls /etc/logrotate.d/ | head -5
    head -20 /etc/logrotate.conf

    AlmaLinux 9 自带 btmp、wtmp、dnf 等片段,放在 /etc/logrotate.d/;主配置 /etc/logrotate.conf 只给全局默认。应用配置也放 /etc/logrotate.d/,不要往主配置里塞。

    /var/log/myapp/*.log {
    daily
    rotate 3
    compress
    missingok
    notifempty
    copytruncate
    }
    指令作用
    daily每天轮转(也可 weekly、size 50M)
    rotate 3保留 3 份历史
    compress轮转后 gzip
    missingok / notifempty文件不存在/为空时不报错、不轮转
    copytruncate先复制再清空原文件,应用不用重开句柄
    Terminal window
    sudo logrotate -d /etc/logrotate.d/myapp
    considering log /var/log/myapp/app.log
    Creating 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 只打印,不改文件。确认配置无误后强制执行一次:

    Terminal window
    sudo logrotate -f /etc/logrotate.d/myapp
    ls -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。
    Terminal window
    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 }
    EOF
    sudo logrotate -f /etc/logrotate.d/lab
    sudo logrotate -f /etc/logrotate.d/lab
    ls /var/log/lab/

    检查:

    1. 存在 a.log.1.gz、a.log.2.gz
    2. a.log 为 0 字节
    3. 连续强制 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。