Logstash:如何逐步构建自定义 grok 模式

在之前的文章 “在摄入时使用 grok 构建 Elasticsearch 数据以加快分析速度”,我们研究了如何在摄取时构造非结构化数据(schema on write),以确保您的分析几乎实时运行。 这样的速度可以帮助将您的可观察性用例提高到一个新的水平。

在本文中,我们将基于从头开始逐步创建新的 grok 模式的基础上学习! 这意味着无论你的用例或要求如何,你都可以构造数据以提高速度。

 

调试 grok 模式

两个可用于构建和调试 grok 模式的工具是我们在本系列博客的上一部分中使用的 Simulate Pipeline API 和 Kibana 的 Grok Debugger。 此处显示的增量构造方法将可使用这两种工具之一。 在本文中,我们将使用 Grok Debugger。

 

结构化数据

对于此博客,让我们假设我们被告知编写一个 grok 模式来解析以下消息:

"55.3.244.1 GET /index.html 15824 0.043 other stuff"

我们还假设我们被告知将上述数据结构化为符合 Elastic Common Schema(ECS)的字段名称,并且获得了有关上述消息的以下信息:

  • 第一个 token 是主机 IP 地址
  • 第二个 token 是 HTTP 请求方法
  • 第三个 token 是 URI
  • 第四个 token 是请求的大小(以字节为单位)
  • 第五个 token 是事件持续时间
  • 剩下的文字只是我们不关心的其他文字

根据这些说明,对于以上消息,我们希望提取以下符合 ECS 的字段:

"host.ip": "55.3.244.1"  
"http.request.method": "GET" 
"url.original": "/index.html" 
"http.request.bytes": 15824 
"event.duration": 0.043

逐步构建新的 grok 表达式

现在,我们将从左到右逐步建立一个 grok 表达式。 让我们开始看看是否可以从信息中提取 IP 地址。 我们将使用 IP grok 模式来匹配host.ip 字段,并使用 GREEDYDATA 模式来捕获 IP 地址之后的所有内容。 如下所示:

%{IP:host.ip}%{GREEDYDATA:my_greedy_match}

让我们转到 Kibana中 的 Dev Tools,使用 Grok Debugger 来查看此 grok 模式是否能够解析消息:

Logstash:如何逐步构建自定义 grok 模式_第1张图片

它按预期工作。 正确提取了 host.ip 字段,并将消息的其余部分存储在 my_greedy_match 中。 成功!

让我们添加 grok 模式的下一部分。 我们知道这是 http.request.method 字段,它是 WORD grok 模式。 因此,我们增加了如下的 grok 模式:

%{IP:host.ip}%{WORD:http.request.method}%{GREEDYDATA:my_greedy_match}

但是,如下所示,在 Kibana 的调试器中对其进行测试将得到一个空响应。 这不是我们所期望的!

Logstash:如何逐步构建自定义 grok 模式_第2张图片

空响应的原因是模式不匹配。 这是因为消息在 host.ip(在此示例中为 55.3.244.1)和 request.method(在此示例中为 GET)之间有一个空格,但在 grok 模式中未包含空格。 让我们解决此错误,然后尝试使用以下 grok 模式。

Logstash:如何逐步构建自定义 grok 模式_第3张图片

有效! 现在,我们提取了 host.ip 和 http.request.method 字段。

 

把上面的都放在一起

我们仍然需要分析其余字段。 我们可以继续逐步添加到 grok 模式中,直到最终得到以下 grok 模式:

%{IP:host.ip} %{WORD:http.request.method} %{URIPATHPARAM:url.original} %{NUMBER:http.request.bytes:int} %{NUMBER:event.duration:double} %{GREEDYDATA:my_greedy_match}

我们可以在 Kibana 中对此进行测试,如下所示:

Logstash:如何逐步构建自定义 grok 模式_第4张图片

它按预期工作! 但是,对于此示例,我们对保留 my_greedy_match 字段不感兴趣,因此可以按如下所示从 grok 表达式中删除它:

%{IP:host.ip} %{WORD:http.request.method} %{URIPATHPARAM:url.original} %{NUMBER:http.request.bytes:int} %{NUMBER:event.duration:double} %{GREEDYDATA}

Logstash:如何逐步构建自定义 grok 模式_第5张图片

这看起来正是我们想要的样子! 现在,我们有了一个 grok 模式,可以用来构造消息字段中包含的数据。

你可以在我以前的 meetup 视频中找到更多关于 grok 用法:

Elastic Logstash 动手实践

 

你可能感兴趣的:(Logstash,elasticsearch,大数据)