基于有效载荷类型的流畅路由

时间:2019-03-04 23:46:10

标签: elasticsearch kibana fluentd

我是Fluentd的新手。我使用fluentd的kubernetes daemonset从Docker容器收集日志并将其发送到kafka。我还有另一个kubernetes服务,该服务使用来自kafka的消息并将其发送给elasticaearh,然后再发送给kibana。我希望将流利记录的log字段拆分为单独的字段,以便在kibana搜索查询中进一步使用。例如:

源记录:

"log" : "{\"foo\" : \"bar\"}"

输出:

"foo" : "bar"
"log" : "{\"foo\" : \"bar\"}"

我想出了以下配置:

<source>
@type kafka
brokers "#{ENV['FLUENT_KAFKA_BROKERS']}"
topics "#{ENV['FLUENT_KAFKA_TOPICS']}"
</source>

<filter "#{ENV['FLUENT_KAFKA_TOPICS']}">
@type parser
key_name log
reserve_data true
 <parse>
   @type json
 </parse>
</filter>

<match "#{ENV['FLUENT_KAFKA_TOPICS']}">
@type elasticsearch
host "#{ENV['FLUENT_ELASTICSEARCH_HOST']}"
port "#{ENV['FLUENT_ELASTICSEARCH_PORT']}"
scheme "#{ENV['FLUENT_ELASTICSEARCH_SCHEME'] || 'http'}"
logstash_format true
</match>

但不幸的是,并非所有日志都采用json格式,因为结果json解析器无法解析纯文本:ParserError error="pattern not match with data

仅当log字段是有效的json对象时,才可以应用json解析器吗?如果是纯文本,我希望原样发送。

1 个答案:

答案 0 :(得分:0)

找到了这个图书馆 https://github.com/ninadpage/fluent-plugin-parser-maybejson/

它不适用于最新的fluentd,将创建PR来解决该问题,只需添加:“ require'fluent / parser'”

更新:升级后,流畅版本的插件无法按README中所述运行。我发现了另一个可以使用流利的1.4.0的软件。

fluent-plugin-multi-format-parser

最终具有以下配置:

<filter "#{ENV['FLUENT_KAFKA_TOPICS']}">
  @type parser
  key_name log
  reserve_data true
  <parse>
    @type multi_format
    <pattern>
      format json
    </pattern>
    <pattern>
      format none
    </pattern>
  </parse>
</filter>

<filter "#{ENV['FLUENT_KAFKA_TOPICS']}">
  @type record_transformer
  remove_keys message  # remove message from non jsom logs
</filter>