ELK系列~Fluentd对大日志的处理过程~16K
程序员文章站
2022-03-10 19:31:38
Fluentd是一个日志收集工具,有输入端和输出端的概念,前者主要是日志的来源,你可以走多种来源方式,http,forward,tcp都可以,后者输出端主要指把日志进行持久化的过程,你可以直接把它持久化到elasticsearch里,也可以直接在控制台输出,这看你如何配置了,更多基础配置可以看大叔这 ......
Fluentd是一个日志收集工具,有输入端和输出端的概念,前者主要是日志的来源,你可以走多种来源方式,http,forward,tcp都可以,后者输出端主要指把日志进行持久化的过程,你可以直接把它持久化到elasticsearch里,也可以直接在控制台输出,这看你如何配置了,更多基础配置可以看大叔这篇文章《ELK系列~对fluentd参数的理解》。
Fluentd输入端的小知识
今天写这篇文章主要是因为在实际工作中遇到的问题,我们为了查询方便把日志定义成了json格式,当你的输入日志不是json时,这条日志将会被抛弃,这个功能点由fluentd的filter过滤器实现,它可以判断你的输入日志是否为json,即不是json会被抛弃!
在项目中出现了大日志无法写入elasticsearch的问题
问题的出现
经过多次测试,发现大于16K的json日志,无法写入elastic,原因经过分析得出结论:当fluentd输入端的日志大于16K时,会被拆封成小日志进行收集,这时被拆封的json就不是标准的了,所以在经过filter时,将会被抛弃!
Fluentd工作流程图
Fluentd大日志分块收集
对于大于16K的日志来说,Fluentd的输入端会分块收集,即大日志被拆封成多个小日志,这时我们设想一下,如果你输入的是json,那被折断之后就一定不是标准的json了,这时,再走filter过滤器时,这条不是json的日志将被折断!
解决方法
目前这个问题在国外开发人员中也出现了,在github上也有人提这个issue,可能是fluentd的bug,我们将继续关注!