Logstash不解析多个命名捕获组

时间:2014-01-31 15:41:50

标签: elasticsearch logstash kibana logstash-grok

我刚刚开始使用Logstash,ElasticSearch和Kibana来查看日志,目前我遇到了一些问题。

我有一个logstash正在收集的日志文件,我想在将这些字段写入ElasticSearch之前从日志条目中提取字段。

我在我的logstash配置文件中定义了一个带有许多命名捕获组的过滤器,但此时只有第一个命名捕获组匹配。

我的日志文件如下所示:

[2014-01-31 12:00:00] [FIELD1:SOMEVALUE] [FIELD2:SOMEVALUE]

我的logstash过滤器如下所示:

if[type] == "mytype {    grok    {    match => [ "message", "(?<TIMESTAMP>regex)", "message", "(?<FIELD1>regex)", "message", "(?<FIELD2>regex)" ]    }    }

if[type] == "mytype { grok { match => [ "message", "(?<TIMESTAMP>regex)", "message", "(?<FIELD1>regex)", "message", "(?<FIELD2>regex)" ] } }

我已经验证了所有字段的正则表达式是正确的但是当我去Kibana仪表板时FIELD1和FIELD2没有出现。

如果有人能对此有所了解,我将不胜感激。

由于

凯文

2 个答案:

答案 0 :(得分:2)

grok的默认行为是在第一场比赛后停止处理。

您可以将break_on_match设为false:

来更改此设置
if[type] == "mytype {
    grok
    {
        match => [ 
            "message", "(?<TIMESTAMP>regex)",
            "message", "(?<FIELD1>regex)",
            "message", "(?<FIELD2>regex)"
        ]
        break_on_match => false
    }    
}

答案 1 :(得分:0)

在学习了更多关于使用grok进行解析之后,我发现很多时候没有必要编写自己的正则表达式。我可以使用许多预定义的grok模式,我可以在解析logstash日志时扩展它们以创建我自己的自定义模式。

logstash支持的grok模式的有用链接:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns

使用新发现的知识,我可以将匹配配置更改为以下内容。

if[type] == "mytype" {
    grok {
        match => ["\[%{TIMESTAMP_ISO8601:dateTime}\]%{SPACE}\[%{WORD}\:%{FLOATINGPOINT:cpu}\]%{SPACE}\[%{WORD}\:%{FLOATINGPOINT:memory}\]"]
    }
}

这使用内置的grok模式TIMESTAMP:ISO8601来挑选我的日志中的日期,并且我创建了一个非常简单的自定义模式FLOATINGPOINT来为我的示例中的内存和cpu选择浮点值。 FLOATINGPOINT模式如下:

FLOATINGPOINT  %{INT}\.%{INT}