如何用 Fluentd 监控(采集)整个目录的日志?
Fluentd 用 in_tail 配合通配符路径(/var/log/app/*.log)即可监控整个目录,含子目录用 ** 递归。本文给出配置示例、pos_file 作用、logrotate 轮转处理与多文件标签区分技巧。
在 in_tail 的 path 里写通配符即可监控整个目录:/var/log/app/*.log;需要递归子目录用 /var/log/app/**/*.log。每个文件会作为独立的输入被持续追踪。
基本配置
<source>
@type tail
path /var/log/app/*.log
pos_file /var/log/fluentd/app.pos
tag app.*
<parse>
@type none
</parse>
</source>
path支持*(单层)与**(递归);pos_file记录每个文件的读取偏移——必须配置且目录可写,否则重启后重复采集;tag app.*中的*会把文件路径带入 tag,方便后续按文件分流。
关键细节
- 新文件发现:
refresh_interval 60s控制目录扫描频率,新建的日志文件最多 1 分钟后被纳入; - 日志轮转:logrotate 轮转后,用
follow_inodes true跟踪 inode 避免漏采; - 老文件:
read_from_head true让新发现的文件从头读(默认从尾部); - 排除文件:
exclude_path ["/var/log/app/*.gz"]排除压缩归档。
观测云对照
观测云 DataKit 的日志采集同样支持目录通配(含递归)、自动追踪轮转、offset 持久化,且在控制台可视化配置、实时查看采集速率;日志进观测云后可用 Pipeline 做结构化解析与脱敏,替代 Fluentd 的 filter 链。
常见问题(FAQ)
Q:目录里文件很多会撑爆吗? 每个文件一个 harvester,数千文件时注意文件描述符限制(ulimit -n)与内存。
Q:能按文件名分到不同索引吗? 用 tag app.* 后在 match 里按 tag 后缀分流到不同输出。