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
}
第三步:手动测试是否生效
- 检查配置是否正确
logrotate -dv /etc/logrotate.d/yourapp
- -d (debug):调试模式,不会真正切割,只会打印执行过程。
- -v:verbose,显示详细信息,你可以确认匹配的日志文件、实际执行的策略等。
- 强制执行一次切割
logrotate -fv /etc/logrotate.d/yourapp
- -v:verbose,显示详细信息
- -f:强制切割
- 这条命令会实际切割日志并告诉你 logrotate 做了什么。
配置字段详解
-
/var/www/yourapp/shared/log/*.log匹配该路径下所有
.log文件,作为 logrotate 的切割对象。 -
weekly每周轮转一次。
其他选项:
daily:每天切割weekly:每周切割monthly:每月切割yearly:每年切割- 也可以用
size 100M按大小切割
-
missingok如果日志文件不存在,不报错,直接跳过。
-
rotate 30保留 30 个归档日志。超过 30 个,最老的会被删除。
-
compress切割后的日志进行压缩(默认 gzip,会生成
.gz文件)。 -
delaycompress延迟压缩一轮。
意思是:最新切割的日志先保留未压缩,等到下次轮转时再压缩。这样避免刚切割后还需要快速查看最近日志的情况。
-
notifempty如果日志文件为空,不进行切割。
-
copytruncate在原文件上复制一份日志内容,然后清空原日志文件,而不是重命名再创建。
适合那些 不能关闭/重启日志文件写入句柄 的程序(如 Rails/Puma、Node.js 等),避免写日志的进程丢失文件句柄。
注意
可能会丢失极少量日志(在 copy 和 truncate 之间)。
-
dateext在切割日志时使用日期作为后缀,比如:
production.log-20250912.gz -
su deploy deploy指定使用
deploy用户和deploy组来创建切割后的日志文件,避免 root 权限问题。(默认 logrotate 可能是 root 运行,如果不加这行,切割后的文件可能权限不对,Rails 就写不进去了。)
