在logstash中挖掘嵌套信息

时间:2013-12-11 12:07:28

标签: filter nested field logstash grok

我的日志事件如下所示:

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

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

是否有机会通过grok过滤器创建我需要的多个字段(=每个记录的事件记录的任务数量)?

或者我应该编写自己的过滤器,至少如何访问这些字段?

1 个答案:

答案 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,因此它会在匹配的第一个模式后停止处理。这将为您提供并行数组nametime