在之前的文章 “在摄入时使用 grok 构建 Elasticsearch 数据以加快分析速度”,我们研究了如何在摄取时构造非结构化数据(schema on write),以确保您的分析几乎实时运行。 这样的速度可以帮助将您的可观察性用例提高到一个新的水平。
在本文中,我们将基于从头开始逐步创建新的 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)的字段名称,并且获得了有关上述消息的以下信息:
根据这些说明,对于以上消息,我们希望提取以下符合 ECS 的字段:
"host.ip": "55.3.244.1"
"http.request.method": "GET"
"url.original": "/index.html"
"http.request.bytes": 15824
"event.duration": 0.043
现在,我们将从左到右逐步建立一个 grok 表达式。 让我们开始看看是否可以从信息中提取 IP 地址。 我们将使用 IP grok 模式来匹配host.ip 字段,并使用 GREEDYDATA 模式来捕获 IP 地址之后的所有内容。 如下所示:
%{IP:host.ip}%{GREEDYDATA:my_greedy_match}
让我们转到 Kibana中 的 Dev Tools,使用 Grok Debugger 来查看此 grok 模式是否能够解析消息:
它按预期工作。 正确提取了 host.ip 字段,并将消息的其余部分存储在 my_greedy_match 中。 成功!
让我们添加 grok 模式的下一部分。 我们知道这是 http.request.method 字段,它是 WORD grok 模式。 因此,我们增加了如下的 grok 模式:
%{IP:host.ip}%{WORD:http.request.method}%{GREEDYDATA:my_greedy_match}
但是,如下所示,在 Kibana 的调试器中对其进行测试将得到一个空响应。 这不是我们所期望的!
空响应的原因是模式不匹配。 这是因为消息在 host.ip(在此示例中为 55.3.244.1)和 request.method(在此示例中为 GET)之间有一个空格,但在 grok 模式中未包含空格。 让我们解决此错误,然后尝试使用以下 grok 模式。
有效! 现在,我们提取了 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 中对此进行测试,如下所示:
它按预期工作! 但是,对于此示例,我们对保留 my_greedy_match 字段不感兴趣,因此可以按如下所示从 grok 表达式中删除它:
%{IP:host.ip} %{WORD:http.request.method} %{URIPATHPARAM:url.original} %{NUMBER:http.request.bytes:int} %{NUMBER:event.duration:double} %{GREEDYDATA}
这看起来正是我们想要的样子! 现在,我们有了一个 grok 模式,可以用来构造消息字段中包含的数据。
你可以在我以前的 meetup 视频中找到更多关于 grok 用法:
Elastic Logstash 动手实践