logrotate是linux日志管理核心工具,通过cron每日自动执行,按时间(daily)或大小(size)触发轮转,配合rotate/maxage保留策略、postrotate通知服务重载、compress/delaycompress压缩及create设置权限,实现日志可控增长与连续写入。

Logrotate 是 Linux 系统日志管理的基石工具,不依赖额外服务,靠 cron 每日自动执行,就能把疯长的日志文件控制在合理范围。关键不是“装上就行”,而是配对触发条件、留够追溯窗口、确保服务不丢日志——这三点没处理好,轮转就容易变成“假自动化”。
明确轮转触发方式:按时间还是按大小?
多数默认配置用 daily,适合访问量稳定的服务(如后台管理接口)。但对高并发 Web 服务(Nginx、API 网关),更推荐用 size 触发,避免某天突发流量导致单日日志暴涨到数 GB:
- daily + size 100M:每天检查,只要日志 ≥100MB 就立即轮转(兼顾周期与体积)
- size 50M:不等时间,一满就切,适合日志写入极不均匀的场景
- 避免单独用 weekly 或 monthly 管理访问日志——万一某周流量翻倍,一个文件就吃掉 20GB+
设置合理的保留策略:别只看数量,要看实际需求
rotate N 决定最多留几个历史文件,但数字不能拍脑袋定:
- 审计合规类日志(如 SSH 登录、sudo 操作)建议 rotate 90 以上,满足常见 3 个月留存要求
- Nginx access.log 通常 rotate 14~30 足够,重点看排查频率——如果平均 3 天查一次问题,留 14 份基本够用
- 搭配 maxage 30 更稳妥:即使 rotate 设了 50,超过 30 天的也会被强制清理,防止单次误操作堆积
确保日志连续不中断:postrotate 不是可选项
轮转后,旧文件被重命名,新文件已创建,但很多服务(Nginx、rsyslog)仍拿着原文件句柄继续写——结果新日志全进 .1 文件,当前文件变空。必须用 postrotate 通知服务切换:
- Nginx 用 kill -USR1(不是 HUP),它会优雅关闭旧文件、打开新文件
- rsyslog 用 systemctl kill --signal=USR1 rsyslog 或 kill -HUP $(pidof rsyslogd)
- Java 应用若不支持信号,改用 copytruncate:先复制内容再清空原文件,进程无感知
- 加 sharedscripts 防止多个日志匹配时重复发信号(比如同时轮转 access.log 和 error.log)
压缩与权限:省空间的同时别埋权限坑
压缩能减小 70%+ 体积,但要注意两个细节:
- compress + delaycompress 组合使用:第一次轮转出 access.log.1,不压缩;下次轮转时才把 access.log.1 压成 .gz,避免刚切完就压缩导致 I/O 高峰
- create 0640 user group 必须写对:比如 Nginx 日志设成 create 0640 www-data adm,否则新日志权限为 600,logrotate 自身或其它分析脚本可能读不了
- 加 missingok 和 notifempty:防止日志目录临时为空或路径错误时整个 logrotate 流程中断











