使用grok模式查询Kibana

时间:2016-06-29 10:22:55

标签: elasticsearch logstash kibana logstash-grok

我们已在日常日志中配置了ELK堆栈,并使用Kibana UI对日志集执行基本搜索/查询操作。

我们的一些日志在邮件中有某个字段,而其他日志则不在。因此,在配置Logstash时,我们尚未将其配置为单独的字段。

我有以下日志:

[28/Jun/2016:23:59:56 +0530] 192.168.xxx.xxx [API:Profile]get_data_login: Project password success:  9xxxxxxxxx0
[28/Jun/2016:23:59:56 +0530] 192.168.xxx.xxx [API:Profile]session_end: logout success:  9xxxxxxxxx0 TotalTime:1.1234

在这两个日志中,我希望为所有TotalTime日志提取session_end。并将其可视化。

我该怎么做?

我可以搜索session_end下列出的所有日志,但是我无法在日志集上执行grok。

2 个答案:

答案 0 :(得分:2)

在logstash中的过滤器中,您可以使用以下内容:

filter {

    ...

    if ([message] ~= "session_end") {
        grok {
             #write grok specifically for the second format of log here
        }
    }
    else if ([message] ~= "get_data_login") {
        grok {
             #write grok specifically for the first format of log here
        }
    }

    ...

}

Grok模式不能用于在Kibana中查询。

答案 1 :(得分:0)

您可以在同一个过滤器中使用两种不同的grok模式:

grok {
  match => {
    "message" => ['\[%{HTTPDATE}\] %{IP} \[API:Profile\]session_end: %{GREEDYDATA:session} TotalTime:%{GREEDYDATA:tt}',
                '\[%{HTTPDATE}\] %{IP} \[API:Profile\]%{GREEDYDATA:data}']
  }
}

消息将通过第一个模式进行测试,如果他们有session_end:TotalTime:,您将拥有包含两个字段的弹性搜索文档。然后,您就可以在这些字段上进行聚合和可视化。

其他消息(没有session_end:TotalTime:)将由第二个过滤器解析。