我的日志事件如下所示:
WARN 12 Dec 00:11:12 slow:[Task[Task-Name 20 ms],Task[Task-Name 30 ms]], time = 1234
这意味着会记录一些可能嵌套的慢速任务。
是否有机会通过grok过滤器创建我需要的多个字段(=每个记录的事件记录的任务数量)?
或者我应该编写自己的过滤器,至少如何访问这些字段?
答案 0 :(得分:1)
我发现Logstash在解析像这样结构较少的日志时会遇到麻烦。
您可以使用grok with a custom capture pattern提取任务子字符串,然后将其转换为带有mutate's split option的子字符串数组:
filter {
grok {
match => ["message", "slow:\[(?<tasks>(?:Task\[%{USER} %{NUMBER} ms\],?)+)\]"]
}
mutate {
split => ["tasks", ","]
}
}
之后的麻烦是grok
通过生成的任务数组没有直接的方法。根据您需要的数据,可能没问题。
如果您确实想要解析这些任务中的字段,我唯一能想到的就是为grok
提供多个匹配候选者,如下所示:
filter {
grok {
match => [
"message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]",
"message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]",
"message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]",
"message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\],Task\[%{USER:name} %{NUMBER:time} ms\]\]",
"message", "slow:\[Task\[%{USER:name} %{NUMBER:time} ms\]\]"
]
}
}
由于grok
通常为break on match,因此它会在匹配的第一个模式后停止处理。这将为您提供并行数组name
和time
。