在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

使用 GROK 构建非结构化数据

如果您使用 Elastic (ELK) 堆栈并且有兴趣将自定义 Logstash 日志映射到 Elasticsearch,那么这篇文章适合您。

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

ELK 堆栈是三个开源项目的缩写:Elasticsearch、Logstash 和 Kibana。 它们共同构成了一个日志管理平台。

  • Elasticsearch 是一个搜索和分析系统。
  • Logstash 是一个服务器端数据处理管道,它同时从多个源获取数据,对其进行转换,然后将其发送到“存储”,例如 Elasticsearch。
  • Kibana 允许用户使用 Elasticsearch 中的图表和图形来可视化数据。

Beats 后来出现的,是一个轻量级的数据传送器。 Beats 的引入将 Elk Stack 转变为 Elastic Stack,但这不是重点。

本文介绍的是 Grok,它是 Logstash 中的一项功能,可以在将日志发送到存储之前对其进行转换。 出于我们的目的,我只会讨论将 Logstash 中的数据处理到 Elasticsearch 中。

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

Grok 是 Logstash 中的一个过滤器,用于将非结构化数据解析为结构化且可查询的数据。 它位于正则表达式 (regex) 之上,并使用文本模式来匹配日志文件中的字符串。

正如我们将在以下几节中看到的,使用 Grok 在高效的日志管理方面会产生很大的不同。

没有 Grok,您的日志数据是非结构化的

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

如果没有 Grok,当日志从 Logstash 发送到 Elasticsearch 并在 Kibana 中呈现时,它们仅出现在消息值中。

在这种情况下查询有意义的信息很困难,因为所有日志数据都存储在单个键中。 如果日志消息能够更好地组织起来就更好了。

来自日志的非结构化数据

localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0

如果仔细查看原始数据,您会发现它实际上由不同的部分组成,每个部分之间用空格分隔。

对于更有经验的开发人员,您可能可以从 API 调用中猜测出每个部分的含义以及日志消息的含义。 每个项目的介绍概述如下。

我们数据的结构化视图

  • ​ 本地主机==环境
  • ​ GET==方法
  • ​ /v2/applink/5c2f4bb3e9fda1234edc64d == url
  • ​ 400==response_status
  • ​ 46ms ==响应时间
  • ​ 5bc6e716b5d6cb35fc9687c0 == user_id

正如我们在结构化数据中看到的那样,非结构化日志是有顺序的。 下一步是原始数据的软件处理。 这就是 Grok 的闪光点。

格罗克模板

内置 Grok 模板

Logstash 附带 100 多个内置模板,用于构建非结构化数据。 对于 apache、linux、haproxy、aws 等通用系统日志,您绝对应该尽可能利用这一点。

但是,当您有如上例所示的自定义日志时会发生什么? 您必须构建自己的 Grok 模板。

自定义 Grok 模板

您必须尝试构建自己的 Grok 模板。 我用了 Grok 调试器 и 格洛克模式.

请注意,Grok 模板语法如下: %{SYNTAX:SEMANTIC}

我尝试做的第一件事就是转到选项卡 Discover 在 Grok 调试器中。 我认为如果这个工具能够自动生成 Grok 模式那就太酷了,但它并没有太大用处,因为它只找到了两个匹配项。

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

利用这一发现,我开始使用 Elastic Github 页面上的语法在 Grok 调试器中创建自己的模板。

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

在尝试了不同的语法之后,我终于能够按照我想要的方式构建日志数据。

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

Grok 调试器链接 https://grokdebug.herokuapp.com/

原文:

localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0

模式:

%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}

最后发生了什么

{
  "environment": [
    [
      "localhost"
    ]
  ],
  "method": [
    [
      "GET"
    ]
  ],
  "url": [
    [
      "/v2/applink/5c2f4bb3e9fda1234edc64d"
    ]
  ],
  "response_status": [
    [
      "400"
    ]
  ],
  "BASE10NUM": [
    [
      "400"
    ]
  ],
  "response_time": [
    [
      "46ms"
    ]
  ],
  "user_id": [
    [
      "5bc6e716b5d6cb35fc9687c0"
    ]
  ]
}

有了 Grok 模板和映射数据,最后一步是将其添加到 Logstash。

更新Logstash.conf配置文件

在安装了 ELK 堆栈的服务器上,转到 Logstash 配置:

sudo vi /etc/logstash/conf.d/logstash.conf

粘贴更改。

input { 
  file {
    path => "/your_logs/*.log"
  }
}
filter{
  grok {
    match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
  }
}
output {
  elasticsearch {
    hosts => [ "localhost:9200" ]
  }
}

保存更改后,重新启动 Logstash 并检查其状态以确保其仍在工作。

sudo service logstash restart
sudo service logstash status

最后,为了确保更改已生效, 请务必在 Kibana 中更新 Logstash 的 Elasticsearch 索引!

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

有了 Grok,您的日志数据就会结构化!

在 LogStash 中使用 GROK 将非结构化数据从日志转换为 ELK Stack 的提示和技巧

正如我们在上图中看到的,Grok 能够自动将日志数据与 Elasticsearch 进行匹配。 这使得管理日志和快速查询信息变得更加容易。 您可以简单地按您要查找的内容(例如环境或 URL)进行过滤,而不是挖掘日志文件来进行调试。

尝试一下 Grok 表达式! 如果您有其他方法来执行此操作或对上面的示例有任何问题,请在下面写评论告诉我。

感谢您的阅读,请在 Medium 上关注我,以获取更多有趣的软件工程文章!

资源

https://www.elastic.co/blog/do-you-grok-grok
https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
https://grokdebug.herokuapp.com/

PS 来源链接

电报频道通过 Elasticsearch

来源: habr.com

添加评论