我的日志事件如下所示:
WARN 12 Dec 00:11:12 slow:[Task[Task-Name 20 ms],Task[Task-Name 30 ms]], time = 1234
这意味着记录了一些可能嵌套的慢任务。
有没有机会通过 grok 过滤器创建我需要的尽可能多的字段(= 每个记录的事件不同的任务数)?
或者我应该编写自己的过滤器,至少我怎样才能访问这些字段?
我发现在解析这样的结构较少的日志时,Logstash 遇到了麻烦。
您可以使用带有自定义捕获模式的 grok提取任务子字符串,然后使用mutate 的 split 选项将其转换为子字符串数组:
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
通常会在 match 上中断,因此它将在第一个匹配的模式之后停止处理。这将为您提供并行数组,name
并且time
.