logrotate支持通配符匹配同目录下多个日志文件,但不支持跨目录递归;多无关路径共用规则应通过include引用共享配置,并用sharedscripts避免postrotate重复执行。

logrotate 中用通配符匹配多个日志路径
logrotate 本身不支持在单个配置块里写多个不相关的绝对路径,但可以通过通配符(*、?、[...])一次覆盖多个符合命名规律的日志文件。比如所有 /var/log/app-*/app.log 或 /var/log/*.log 都能被同一组规则处理。
注意:通配符只作用于文件名层级,不能跨目录递归匹配(** 不被支持),且必须确保 glob 结果至少匹配一个真实文件,否则该配置块会被 logrotate 忽略(静默跳过,不报错)。
- 推荐写法:
/var/log/nginx/*.log→ 匹配/var/log/nginx/access.log、/var/log/nginx/error.log - 避免写法:
/var/log/nginx/*→ 可能意外匹配到非日志目录或临时文件,导致 rotate 失败或误删 - 安全实践:先用
ls /var/log/nginx/*.log手动验证 glob 是否精准命中目标文件
用 include 加载多个独立配置文件实现“复用规则”
当多个路径完全无关(比如 /var/log/app1.log 和 /var/log/redis/output.log),又想共用相同 rotate 行为时,最稳妥的方式不是硬塞进一个块,而是把公共规则抽成单独文件,再用 include 引入。
logrotate 主配置(如 /etc/logrotate.conf)默认包含 /etc/logrotate.d/ 下所有文件,你可以这样组织:
# /etc/logrotate.d/common-rules
/shared-rotate-rules {
daily
missingok
rotate 7
compress
delaycompress
notifempty
}
# /etc/logrotate.d/app1
/var/log/app1.log {
include /etc/logrotate.d/common-rules
}
# /etc/logrotate.d/redis
/var/log/redis/output.log {
include /etc/logrotate.d/common-rules
}
⚠️ 注意:include 只能在配置块内部使用,且 logrotate 2.10+ 才支持;旧版本需改用 shell 脚本生成配置或直接复制粘贴规则。
用 sharedscripts 避免 postrotate 重复执行
当多个路径共享一套规则,且你依赖 postrotate 脚本(比如通知服务重载日志)时,如果不加控制,每个匹配到的文件都会单独触发一次脚本——这通常不是你想要的。
sharedscripts 就是为此设计的:它让整个 glob 匹配到的所有文件,在本次 rotate 周期中只执行一次 postrotate(和 prerotate)。
- 有
sharedscripts:/var/log/nginx/*.log匹配到 3 个文件 →postrotate运行 1 次 - 无
sharedscripts:同样匹配 3 个文件 →postrotate运行 3 次(可能造成服务反复 reload) - 必须配合 glob 使用,对单个路径无意义
测试配置是否生效的两个关键命令
写完配置别急着等 cron 触发,先本地验证。最容易被忽略的是权限和路径解析问题。
- 检查语法:
logrotate -d /etc/logrotate.conf(-d是 debug 模式,会打印匹配过程,但不真正 rotate) - 强制运行并看效果:
logrotate -vf /etc/logrotate.d/myapp(-v显示详情,-f强制执行,注意确认目标文件可写、父目录可写) - 常见失败原因:
No such file or directory(glob 无匹配)、error: skipping "/var/log/app.log" because parent directory has insecure permissions(/var/log权限不是 0755 或属主不对)
多路径共用规则的本质是减少重复,而不是强行合并;真正难的是路径发现是否准确、脚本执行时机是否合理、以及权限是否被 silently 拒绝——这些地方出问题,logrotate 往往一声不吭就跳过了。











