推荐用Ansible或SaltStack统一推送logrotate配置,避免手动修改;Ansible示例含语法校验、copytruncate、按大小切割及通配符路径处理。

logrotate 配置如何统一推送到上百台服务器
直接改每台机器的 /etc/logrotate.d/ 下文件不可持续,必须走配置下发。推荐用 Ansible 或 SaltStack,不建议手动 SCP + for 循环。
Ansible 示例(假设已建好 inventory):
- name: deploy nginx logrotate config
copy:
src: files/nginx-logrotate
dest: /etc/logrotate.d/nginx
owner: root
group: root
mode: '0644'
- name: reload logrotate config
command: /usr/sbin/logrotate -d /etc/logrotate.conf
args:
creates: /var/lib/logrotate/logrotate.status
- 所有目标主机需预装
logrotate(主流发行版默认自带,但 CentOS Stream 8+ 或某些最小化镜像可能需yum install -y logrotate) - 不要依赖
postrotate里 reload 服务 —— 上百台同时发 HUP 可能压垮 Nginx 进程或触发连接重置,改用copytruncate更稳妥 - 务必在 playbook 中加
validate: /usr/sbin/logrotate -d %s校验语法,避免推送错误配置导致全量日志轮转失败
按大小切割比按时间更可控,尤其对流量不均的服务
比如某 Java 应用日志在促销期单小时打满 2GB,平时一天才 50MB —— 若只设 daily,高峰时日志仍会暴涨;而 size 100M 能实时响应。
配置示例(/etc/logrotate.d/java-app):
/var/log/myapp/*.log {
size 100M
rotate 30
compress
delaycompress
missingok
notifempty
copytruncate
dateext
dateformat -%Y%m%d-%s
}
-
dateformat -%Y%m%d-%s避免同秒内多文件命名冲突(split不支持毫秒,但 logrotate 支持%s秒级时间戳) -
copytruncate是关键:不中断写入,适合无法停服或 reload 的 Java 进程(对比create需要应用感知新文件) - 慎用
maxage:它按文件 mtime 判断过期,而copytruncate后原文件 mtime 不变,会导致旧归档滞留
日志路径分散时,别硬写死目录,用通配符 + include
上百台服务器上,/var/log 目录结构常不一致(有的挂载在 /data/log,有的用容器卷映射)。硬编码路径会让配置失效。
- 在
/etc/logrotate.conf末尾加一行:include /etc/logrotate.d/custom/*.conf - 实际配置放到
/etc/logrotate.d/custom/app1.conf,内容用通配符:/data/*/logs/*.log或/var/log/**/service*.log(注意:logrotate 本身不支持双星号,需靠 shell 展开,所以得用prerotate动态生成匹配列表) - 更稳的做法是:用
find在prerotate里枚举路径,再逐个logrotate -f单独处理,避免通配失败静默跳过
debug 和监控必须前置,否则批量出错就是事故
logrotate 没日志、没返回值、错配后静默失败 —— 百台中只要一台漏配,就可能撑爆磁盘。
- 上线前必跑:
logrotate -d -f /etc/logrotate.d/myapp,检查输出里有没有error:或warning: - 加 cron 监控:每天执行前写个脚本,统计
ls -lt /var/log/**/*.log-* | head -20最新归档时间,告警超过 24 小时无新归档 - 真实坑点:
dateext开启后,若系统时间回拨(如 NTP 校正),可能生成重复名文件并覆盖,建议搭配dateformat -%Y%m%d-%s且禁用nocreate
最麻烦的不是配置本身,而是不同服务器上 logrotate 版本差异(RHEL7 默认 3.8.6,Ubuntu 22.04 是 3.18.0)—— 某些参数如 olddir 在老版本不支持,必须查 man logrotate 确认可用性。


















