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>
我们有一个要求,我们只需要将特定的字符串日志转发到 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>