1

我的日志事件如下所示:

WARN 12 Dec 00:11:12 slow:[Task[Task-Name 20 ms],Task[Task-Name 30 ms]], time = 1234

这意味着记录了一些可能嵌套的慢任务。

有没有机会通过 grok 过滤器创建我需要的尽可能多的字段(= 每个记录的事件不同的任务数)?

或者我应该编写自己的过滤器,至少我怎样才能访问这些字段?

4

1 回答 1

1

我发现在解析这样的结构较少的日志时,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.

于 2013-12-12T00:45:25.743 回答