logrotate 配置服务日志自动归档切割需独立配置文件、合理触发条件(daily/size)、rotate 30、compress、delaycompress、missingok、notifempty、create 和 copytruncate 等关键参数,并通过 sharedscripts+postrotate 通知服务重载,验证用 -d/-f 参数及状态检查。
服务日志自动归档切割,核心是用 logrotate 配合服务自身机制实现,不依赖服务内置功能,也不需要改应用代码。关键在于配置合理、触发及时、归档可追溯、新日志不断写。
单独为服务建配置文件(推荐)
不要动 /etc/logrotate.conf 主配置,直接在 /etc/logrotate.d/ 下新建文件,比如 myapp:
- 路径必须准确,例如:
/var/log/myapp/app.log - 用大括号包裹所有规则,缩进可读但非必需
- 常见组合:按天检查 + 保留30份 + 压缩 + 自动重建文件
关键参数要配全
一个稳定可用的最小配置应包含这些要素:
- daily 或 size 50M:选其一作为触发条件;流量不稳优先用 size
- rotate 30:只留最近30个归档,超龄自动删
- compress + delaycompress:压缩省空间,delaycompress 避免 postrotate 读不到原始日志
- missingok:日志文件还没生成也不报错,防止中断其他配置执行
- notifempty:空文件不轮转,避免无意义归档
- create 0644 myapp myapp:轮转后立刻新建日志,权限和属主设对,服务才写得进去
- copytruncate:适用于不能停服务的场景(如 Java 应用),先截断再归档,不依赖服务 reopen
通知服务重载日志(可选但重要)
像 Nginx、Apache 这类支持日志 reopen 的服务,建议加 sharedscripts + postrotate:
- 确保只执行一次 reload,不是每个匹配文件都 reload 一遍
- Nginx 示例:
kill -USR1 `cat /var/run/nginx.pid` - systemd 服务示例:
systemctl kill --signal=USR1 myapp.service - 注意:使用
copytruncate时通常不需要 reload,因为日志文件没被移动或删除
验证和调试不能跳过
别等 cron 跑一天才发现配错了:
-
logrotate -d /etc/logrotate.d/myapp:看调试输出,确认是否“will rotate” -
logrotate -f /etc/logrotate.d/myapp:强制执行一次,检查归档文件是否生成、权限是否正确、新日志是否可写 - 查状态记录:
cat /var/lib/logrotate/status | grep myapp,看上次轮转时间是否更新 - 检查目录权限:logrotate 以 root 运行,但
create指定的属主需对日志目录有写权限











