使用 GROK 构建非结构化数据
如果您使用 Elastic (ELK) 堆栈并且有兴趣将自定义 Logstash 日志映射到 Elasticsearch,那么这篇文章适合您。
ELK 堆栈是三个开源项目的缩写:Elasticsearch、Logstash 和 Kibana。 它们共同构成了一个日志管理平台。
- Elasticsearch 是一个搜索和分析系统。
- Logstash 是一个服务器端数据处理管道,它同时从多个源获取数据,对其进行转换,然后将其发送到“存储”,例如 Elasticsearch。
- Kibana 允许用户使用 Elasticsearch 中的图表和图形来可视化数据。
Beats 后来出现的,是一个轻量级的数据传送器。 Beats 的引入将 Elk Stack 转变为 Elastic Stack,但这不是重点。
本文介绍的是 Grok,它是 Logstash 中的一项功能,可以在将日志发送到存储之前对其进行转换。 出于我们的目的,我只会讨论将 Logstash 中的数据处理到 Elasticsearch 中。
Grok 是 Logstash 中的一个过滤器,用于将非结构化数据解析为结构化且可查询的数据。 它位于正则表达式 (regex) 之上,并使用文本模式来匹配日志文件中的字符串。
正如我们将在以下几节中看到的,使用 Grok 在高效的日志管理方面会产生很大的不同。
没有 Grok,您的日志数据是非结构化的
如果没有 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 模板语法如下: %{SYNTAX:SEMANTIC}
我尝试做的第一件事就是转到选项卡 Discover 在 Grok 调试器中。 我认为如果这个工具能够自动生成 Grok 模式那就太酷了,但它并没有太大用处,因为它只找到了两个匹配项。
利用这一发现,我开始使用 Elastic Github 页面上的语法在 Grok 调试器中创建自己的模板。
在尝试了不同的语法之后,我终于能够按照我想要的方式构建日志数据。
Grok 调试器链接
原文:
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 索引!
有了 Grok,您的日志数据就会结构化!
正如我们在上图中看到的,Grok 能够自动将日志数据与 Elasticsearch 进行匹配。 这使得管理日志和快速查询信息变得更加容易。 您可以简单地按您要查找的内容(例如环境或 URL)进行过滤,而不是挖掘日志文件来进行调试。
尝试一下 Grok 表达式! 如果您有其他方法来执行此操作或对上面的示例有任何问题,请在下面写评论告诉我。
感谢您的阅读,请在 Medium 上关注我,以获取更多有趣的软件工程文章!
资源
PS
电报频道通过
来源: habr.com