使用 grok 模式查询 Kibana

Querying Kibana using grok pattern

我们在日常日志上配置了 ELK 堆栈,并使用 Kibana UI 对日志集执行基本 search/query 操作。

我们的一些日志在消息中​​有特定字段,而另一些则没有。因此我们在配置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

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

我应该怎么做?

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

在 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 中的查询。

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

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

消息将通过第一个模式进行测试,如果它们有 session_end:TotalTime:,您将拥有一个包含这两个字段的 elasticsearch 文档。然后你就可以对这些字段进行聚合和可视化了。

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