FluentD 如何忽略模式不匹配日志不转发到端点

FluentD How to ignore pattern not match log not to forward to endpoint

我们有一个要求,我们只需要将特定的字符串日志转发到 kibana endpoint/console。目前我们在找不到匹配字符串的地方得到模式不匹配行。如何忽略那些不发送给转发器而只发送匹配日志的日志。

<source>
  @type tail
  path session.txt
  pos_file session.txt.pos
  tag sessionlog
  <parse>
    @type regexp
    expression ^\<#\>\s+(?<time>\w+/\w+/\w+\s+[:0-9]+)\s+(?<hostname>[-0-9A-Z]+)\s+(?<message>.*Clip.*)$/
  </parse>
</source>

<match sessionlog>
  @type stdout
</match>
<#> 2019/11/16 13:56:33 ABC-Hostanme 278424 Dispatcher_1 Msg [Unit1] error emitted: '404'from session start: 2021-11-16T08:54:01
<#> 2019/11/16 13:56:33 ABC-Hostanme 278424 Dispatcher_1 Msg [Unit1] clip result: a1=0, a2=217, a3=152475, a4=148692

结果:

[warn]: #0 pattern not match: <#> 2019/11/16 13:56:33 ABC-Hostanme 278424 Dispatcher_1 Msg [Unit1] error emitted: '404'from session start: 2021-11-16T08:54:01
sessionlog: {"hostname":"DESKTOP-3JOOBVV","message":"278424 Dispatcher_1 Msg [Unit1] clip result: a1=0, a2=217, a3=152475, a4=148692"}

我们只想获取匹配的模式日志。

@sunshine,如果正则表达式解析器无法从日志中提取匹配项,它将发出该错误。因此,建议所有通过正则表达式解析器的日志行都可以与表达式匹配。我建议您在正则表达式解析器之前使用 grep 过滤器,以避免来自 fluentd 的那些“模式不匹配”​​日志。

我在下面粘贴了一个示例,但您也可以在 grep 过滤器中使用 <exclude> 块。有关更多信息和示例,请参见此处:https://docs.fluentd.org/filter/grep

<source>
  @type tail
   path session.txt
   pos_file session.txt.pos
   tag sessionlog
</source>

<filter sessionlog>
  @type grep
  <regexp>
    key message
    pattern /INCLUDE_PATTERN_HERE/
  </regexp>
</filter>

<filter sessionlog>
  @type parser
  key_name message
  reserve_data true
  <parse>
    @type regexp
    expression ^\<#\>\s+(?<time>\w+/\w+/\w+\s+[:0-9]+)\s+(?<hostname>[-0-9A-Z]+)\s+(?<message>.*Clip.*)$/
  </parse>
</filter>

<match sessionlog>
  @type stdout
</match>

@renegaderyu的回答是一个很明确的解决方案。然而,FluentD 提供了一个不那么冗长的 built-in 解决方案。 You can just set the key emit_invalid_record_to_error to false inside the <filter> in which you parse。重要的是要注意此选项仅在 <filter> 中有效并且在 <source>.

中没有任何效果
<source>
  @type tail
  path session.txt
  pos_file session.txt.pos
  tag sessionlog
</source>

<filter sessionlog>
  @type parser
  key_name message
  reserve_data true
  <parse>
    @type regexp
    expression ^\<#\>\s+(?<time>\w+/\w+/\w+\s+[:0-9]+)\s+(?<hostname>[-0-9A-Z]+)\s+(?<message>.*Clip.*)$/
  </parse>
  emit_invalid_record_to_error false
</filter>

<match sessionlog>
  @type stdout
</match>