1

我刚刚开始使用 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)" ]    }    }

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

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

谢谢

凯文

4

2 回答 2

2

grok 的默认行为是在第一次匹配后停止处理。

您可以通过设置break_on_match为 false 来更改它:

if[type] == "mytype {
    grok
    {
        match => [ 
            "message", "(?<TIMESTAMP>regex)",
            "message", "(?<FIELD1>regex)",
            "message", "(?<FIELD2>regex)"
        ]
        break_on_match => false
    }    
}
于 2014-01-31T23:31:25.893 回答
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  %{INT}\.%{INT}
于 2015-05-13T15:38:58.857 回答