跳到主要内容

Logrotate 切割压缩日志

· 阅读需 3 分钟

Logrotate 的作用

Logrotate 是 Linux 系统里常用的日志管理工具,用来:

  • 定期切割日志(避免单个日志文件过大)。
  • 按日期或大小生成新的日志文件。
  • 保留一定数量的历史日志,并自动清理过期日志。
  • 支持压缩归档。
  • 支持针对不同服务单独配置。

使用 Logrotate

第一步:新建配置文件

vim /etc/logrotate.d/yourapp

第二步:填写如下内容

/var/www/yourapp/shared/log/*.log {
weekly
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
dateext
su deploy deploy
}

第三步:手动测试是否生效

  1. 检查配置是否正确
logrotate -dv /etc/logrotate.d/yourapp
  • -d (debug):调试模式,不会真正切割,只会打印执行过程。
  • -v:verbose,显示详细信息,你可以确认匹配的日志文件、实际执行的策略等。
  1. 强制执行一次切割
logrotate -fv /etc/logrotate.d/yourapp
  • -v:verbose,显示详细信息
  • -f:强制切割
  • 这条命令会实际切割日志并告诉你 logrotate 做了什么。

配置字段详解

  1. /var/www/yourapp/shared/log/*.log

    匹配该路径下所有 .log 文件,作为 logrotate 的切割对象。

  2. weekly

    每周轮转一次。

    其他选项:

    • daily:每天切割
    • weekly:每周切割
    • monthly:每月切割
    • yearly:每年切割
    • 也可以用 size 100M 按大小切割
  3. missingok

    如果日志文件不存在,不报错,直接跳过。

  4. rotate 30

    保留 30 个归档日志。超过 30 个,最老的会被删除。

  5. compress

    切割后的日志进行压缩(默认 gzip,会生成 .gz 文件)。

  6. delaycompress

    延迟压缩一轮。

    意思是:最新切割的日志先保留未压缩,等到下次轮转时再压缩。这样避免刚切割后还需要快速查看最近日志的情况。

  7. notifempty

    如果日志文件为空,不进行切割。

  8. copytruncate

    在原文件上复制一份日志内容,然后清空原日志文件,而不是重命名再创建。

    适合那些 不能关闭/重启日志文件写入句柄 的程序(如 Rails/Puma、Node.js 等),避免写日志的进程丢失文件句柄。

注意

可能会丢失极少量日志(在 copy 和 truncate 之间)。

  1. dateext

    在切割日志时使用日期作为后缀,比如:

    production.log-20250912.gz
  2. su deploy deploy

    指定使用 deploy 用户和 deploy 组来创建切割后的日志文件,避免 root 权限问题。

    (默认 logrotate 可能是 root 运行,如果不加这行,切割后的文件可能权限不对,Rails 就写不进去了。)