如何用 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控制启动时无位置记录文件的读取起点;自 Fluentd 1.14.3 起,运行中新发现的文件即使为 false 也从头读; - 排除文件:
exclude_path ["/var/log/app/*.gz"]排除压缩归档。
常见问题(FAQ)
Q:目录里文件很多会撑爆吗? in_tail 会维护文件监视与读取状态(harvester 是 Filebeat 术语),数千文件时注意文件描述符限制(ulimit -n)与内存。
Q:能按文件名分到不同索引吗? 用 tag app.* 后在 match 里按 tag 后缀分流到不同输出。