Fluent Bit 的 tail 输入插件丢失日志行怎么办?
Fluent Bit tail 插件漏读日志行通常是因为没有用 inotify 监听文件变化。开启 Inotify_Watcher On 即可实时捕获新行。本文说明原因和配置。
核心解决:在 tail input 配置中开启 Inotify_Watcher On。Fluent Bit 默认用轮询(polling)方式检查文件变化,可能遗漏快速写入的日志;inotify 是 Linux 内核的文件事件通知机制,能实时捕获每一行新日志。
配置方法
[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太小会丢弃超长行; - 文件轮转:轮转瞬间可能有遗漏,确保配置了
Rotate_Wait; - DB 文件:
DB参数用于记录读取偏移,确保配置正确:
[INPUT]
Name tail
Path /var/log/myapp/*.log
DB /var/log/flb_myapp.db
Inotify_Watcher On
观测云对照
观测云 DataKit 的日志采集器内置了文件监听和轮转处理机制,自动跟踪文件变化并维护读取偏移,不需要手动配置 inotify;在 K8s 环境中以 DaemonSet 部署,自动采集所有容器的 stdout 日志。
常见问题(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),内存缓冲在进程崩溃时会丢失数据;文件系统缓冲更可靠。