Fluent Bit Tail Input只读取每个日志文件的前几行,直到它再次启动



问题

我有一个Fluent Bit服务(在docker容器中运行(,它需要跟踪日志文件(从主机装载到容器中(,然后将这些日志转发到Elasticsearch。对于这个PoC,我每分钟创建一个新的日志文件(例如spring-bot-logger-2021-05-25_10_53.0.log、spring-bot-logger-2021-05-25_10_54.0.log等(

我可以看到Fluent Bit会拾取所有文件,但它只读取并转发文件的前几行(每个日志条目都是一行,格式为JSON(。只有当Fluent Bit容器重新启动时,它才会读取并转发其余的文件。

为了演示这个问题,我有一个脚本,它在100秒内生成200个日志条目(即每秒2个日志(。运行此脚本后,我在Elastic中得到了少量条目,如图所示在这张图片中。在这里,我们可以看到只有72个条目,条目之间有很大的间隙。

一旦我重新启动Fluent Bit容器,它就会处理其余的文件并填写所有日志,如图所示在这张图片中。

这是我的Fluent Bit配置文件:

[SERVICE]
Flush     5
Daemon    off
Log_Level debug
Parsers_File   /fluent-bit/etc/parsers.conf
[INPUT]
Name  tail
Parser docker
Path  /var/log/serviceA/*.log
Tag   service.A
DB    /var/db/ServiceA
Refresh_Interval 30
[INPUT]
Name  tail
Parser docker
Path  /var/log/serviceB/*.log
Tag   service.B
DB    /var/db/ServiceB
Refresh_Interval 30
[OUTPUT]
Name  stdout
Match service.*
[OUTPUT]
Name  es
Host  es01
Port  9200
Logstash_Format On
tls   Off
Match service.*

我尝试过的我已经尝试过以下内容:

  • 将刷新率提高到1s
  • 将refresh_interval缩短为10s
  • 减小了Buffer_Chun_Size&Buffer_Max_Size设置为1k,希望它能迫使Fluent Bit更频繁地刷新日志
  • 增加的Buffer_Chun_Size&Buffer_ Max_ Size设置为1M;暂停";回调未按预期工作
  • 明确配置了5M的Mem_Buf_Limit
  • 已试用Fluent Bit版本1.7、1.6和1.5

我还使用了这些容器的调试版本来确认文件是否正确安装到容器中,并且它们反映了所有日志(当Fluent Bit没有接收到它时(

Fluent Bit的日志级别也设置为调试,但日志中没有提示或错误。

其他人经历过这个问题吗?

我在Openshift上使用glusterfs处理持久卷时遇到了同样的问题。

我的解决方法是在Dockerfile:中添加一小部分后,分叉官方回购并构建一个新的流畅的Docker镜像

RUN cmake ... 
... 
-DFLB_INOTIFY=Off 
..

然而,与此同时,我看到在尾部输入文档中现在有一个名为Inotify_Watcher的配置参数,我想它可以用于此目的。

我不确定,但我认为Fluentbit(1.7和1.8(在PV中的共享日志上有访问错误。它有权限,可以查看文件,但在第一次获取后不会获取日志行。

我找到了解决方案,将Fluentbit作为一个侧车,而不是一个单独的吊舱。