Spa*_*nky 50 filter logstash logstash-grok
我想知道使用Logstash Grok过滤器的最佳方法是什么.我有一些特定日志条目的过滤器,不适用于所有条目.那些不适用的标签始终生成_grokparsefailure标签.例如,我有一个grok过滤器,用于每个日志条目,它工作正常.然后我有另一个过滤器,用于带有回溯的错误消息.回溯过滤器为每个没有回溯的日志条目抛出grokparsefailure.
如果没有匹配而不是添加parsefailure标记,我宁愿让它只是通过规则.我使用parsefailure标签来查找未正确解析的内容,而不是与特定过滤器不匹配的内容.也许只是命名"解析失败"才能得到我.对我而言,这意味着过滤器出现了问题(例如格式错误),而不是它不匹配.
所以问题是,我该如何处理?
使用过滤器模式可选吗?
(ab)使用tag_on_failure选项将其设置为空[]
使用诸如"if ifback in message"之类的东西使过滤器有条件
还有别的什么我不考虑?
提前致谢.
编辑
我采取了在过滤器周围添加条件的路径:
if [message] =~ /took\s\d+/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => ["message", "took\s+(?<servicetime>[\d\.]+)"]
add_tag => [ "stats", "servicetime" ]
}
}
Run Code Online (Sandbox Code Playgroud)
仍然对反馈感兴趣.什么被认为是"最佳实践"?
rut*_*ter 37
如果可能的话,我会使用条件包装器,就像你正在使用的那个一样.随意张贴作为答案!
如果您的应用程序只生成几种不同的行格式,则可以使用grok过滤器使用多种匹配模式.默认情况下,过滤器将处理第一个成功匹配:
grok {
patterns_dir => "./patterns"
match => {
"message" => [
"%{BASE_PATTERN} %{EXTRA_PATTERN}",
"%{BASE_PATTERN}",
"%{SOME_OTHER_PATTERN}"
]
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的逻辑不那么简单(可能需要多次检查相同的条件),grep过滤器可用于添加标记.像这样的东西:
grep {
drop => false #grep normally drops non-matching events
match => ["message", "/took\s\d+/"]
add_tag => "has_traceback"
}
...
if "has_traceback" in [tags] {
...
}
Run Code Online (Sandbox Code Playgroud)
Gar*_*ers 22
您还可以tag_on_failure => []像这样添加到您的grok节:
grok {
match => ["context", "\"tags\":\[%{DATA:apptags}\]"]
tag_on_failure => [ ]
}
Run Code Online (Sandbox Code Playgroud)
grok仍然会失败,但是会在不添加标签数组的情况下完成.
这是最有效的方法.忽略过滤器
filter {
grok {
match => [ "message", "something"]
}
if "_grokparsefailure" in [tags] {
drop { }
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
57531 次 |
| 最近记录: |