Fluent Bit 的 tail 输入插件丢失日志行怎么办?
Fluent Bit tail 漏行需检查轮转、长行限制、偏移状态、缓冲和输出。支持 inotify 的 Linux 构建通常已默认开启,文件事件不保证端到端无丢失。本文说明原因和配置。
排查应覆盖读取、轮转、缓冲和输出确认。支持 inotify 的 Linux 构建通常默认已开启 Inotify_Watcher On;inotify 通知文件变化,不逐行通知,也不保证端到端无丢失。
配置方法
[INPUT]
Name tail
Path /var/log/myapp/*.log
Tag myapp.*
Inotify_Watcher On
[OUTPUT]
Name stdout
Match myapp.*
原理解释
| 机制 | 工作原理 | 缺点 |
|---|---|---|
| 轮询 | 定时扫描文件大小变化 | 写入快本身不等于跳行;文件在发现前轮转/删除等会导致遗漏 |
| inotify | 内核主动通知文件变化 | 响应较及时,仍可能队列溢出、轮转或下游丢失 |
开启 Inotify_Watcher 后,Fluent Bit 可用文件事件触发读取,但不代表每次写入都即时完成消费,也仍需文件发现和状态管理。
其他可能导致漏读的原因
- Buffer 大小:超过 Buffer_Max_Size 时默认可能停止监控该文件;显式 Skip_Long_Lines On 才是跳过长行并继续;
- 文件轮转:轮转瞬间可能有遗漏,核对
Rotate_Wait、源文件保留时间及轮转方式,不能只靠等待配置保证无丢失; - DB 文件:
DB参数用于记录读取偏移,确保配置正确:
[INPUT]
Name tail
Path /var/log/myapp/*.log
DB /var/log/flb_myapp.db
Inotify_Watcher On
常见问题(FAQ)
Q:Inotify_Watcher 有什么缺点吗?
A:inotify 的监控描述符数量有限(/proc/sys/fs/inotify/max_user_watches),监控大量文件时可能需要调大。
Q:Windows 上也能用 inotify 吗?
A:不能。inotify 是 Linux 特有机制。Windows 上 Fluent Bit 的 tail 插件使用轮询。
Q:开启后还是有日志丢失?
A:检查 Fluent Bit 的内存/文件缓冲配置(storage.type filesystem),内存缓冲在进程崩溃时会丢失数据;文件系统缓冲需配置持久路径、容量和同步策略;Tail DB 仅保存读取位置,不保证记录已被下游持久接收。