我刚刚开始使用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没有出现。
如果有人能对此有所了解,我将不胜感激。
由于
凯文
答案 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}