干货 | Logstash Grok数据结构化ETL实战

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云解析 DNS,旗舰版 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志分析是ELK起家的最核心业务场景之一。如果你正在使用Elastic Stack并且正尝试将自定义Logstash日志映射到Elasticsearch,那么这篇文章适合您。Logstash写入ES之前的中间数据处理过程一般叫做:数据ETL或者数据清洗。本文重点介绍数据清洗环节的非结构数据转化为结构化数据的——Grok实现。

1、认知前提

老生常谈,夯实基础认知。

ELK Stack是三个开源项目的首字母缩写:Elasticsearch,Logstash和Kibana。 它们可以共同构成一个日志管理平台。

Elasticsearch:搜索和分析引擎。

Logstash:服务器端数据处理管道,它同时从多个源中提取数据,对其进行转换,然后将其发送到Elasticsearch存储。

Kibana:图表和图形来可视化数据ES中数据。

Beats后来出现,是一个轻量级的数据传输带(data shipper)。 Beats的引入将ELK Stack转换为Elastic Stack。

2、啥是Grok?

Grok是Logstash中的过滤器,用于将非结构化数据解析为结构化和可查询的数据。

它位于正则表达式之上,并使用文本模式匹配日志文件中的行。

下文分析你会看到,使用Grok在有效的日志管理方面大有裨益!

一图胜千言。

image.png

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

在这种情况下,查询有意义的信息很困难,因为所有日志数据都存储在一个key中。

白话文——Grok的目的:

将如上一个key对应的一长串非结构的Value,转成多个结构化的Key对应多个结构化的Value。


3、日志数据非结构化 VS 结构化

3.1 非结构化原始日志数据

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

1

如果仔细查看原始数据,可以看到它实际上由不同的部分组成,每个部分用空格分隔符分隔。

对于更有经验的开发人员,您可以猜测每个部分的含义,以及来自API调用的日志消息。

从数据分析的角度:非结构化数据不便于检索、统计、分析。


3.2 结构化日志数据

localhost == environment (基础环境信息)

GET == method (请求方式)

/v2/applink/5c2f4bb3e9fda1234edc64d == url (URL地址)

400 == response_status (响应状态码)

46ms == response_time (响应时间)

5bc6e716b5d6cb35fc9687c0 == user_id (用户Id)

1

2

3

4

5

6

如上切分的中间转换正是借助grok实现。非结构化数据变成结构化数据后才凸显价值,检索、统计、分析等都变得非常简单了。


4、Grok模式

4.1 内置模式

Logstash提供了超过100种内置模式,用于解析非结构化数据。

对于常见的系统日志,如apache,linux,haproxy,aws等,内置模式是刚需+标配。

但是,当您拥有自定义日志时会发生什么? 必须构建自己的自定义Grok模式。


4.2 自定义模式

构建自己的自定义Grok模式需要反复试验。 推荐使用Grok Debugger和Grok Patterns做验证。

Grok Debugger地址:https://grokdebug.herokuapp.com/ ,注意:需要梯子。

Grok Patterns地址:https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns


请注意,Grok模式的语法是:%{SYNTAX:SEMANTIC}

实践一把:

步骤1:进入Grok Debugger中的Discover选项卡。

期望这个工具可以自动生成Grok模式,但它没有太大帮助,因为它只发现了如下两个匹配。

image.png

步骤2:借助Elastic的github上的语法在Grok Debugger上构建模式。

image.png

步骤3:Grok Debugger实操验证。

image.png

如上截图:

输入待匹配的源非结构化数据:


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

1

输入匹配模式:


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

1

输出结构化数据解析后匹配结果:


{

 "environment": [

   [

     "localhost"

   ]

 ],

 "method": [

   [

     "GET"

   ]

 ],

 "url": [

   [

     "/v2/applink/5c2f4bb3e9fda1234edc64d"

   ]

 ],

 "response_status": [

   [

     "400"

   ]

 ],

 "BASE10NUM": [

   [

     "400"

   ]

 ],

 "response_time": [

   [

     "46ms"

   ]

 ],

 "user_id": [

   [

     "5bc6e716b5d6cb35fc9687c0"

   ]

 ]

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

在使用不同的语法后,终于能够以期望的方式构建日志数据。


5、grok集成到Logstash filter环节验证

步骤1:切换路径。

在安装ELK Stack的服务器上,切换到Logstash配置。


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

1

步骤2:拷贝核心Grok配置, 更新Logstash.conf。

将验证后的grok部分贴过来。

注意:核心三段论结构。

1、输入:日志路径;

2、中间处理ETL:grok解析

3、输出:ES。


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" ]

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

步骤3:重启。

保存更改后,重新启动Logstash并检查其状态以确保它仍然有效。


sudo service logstash restart

sudo service logstash status

1

2

6、Kibana可视化验证

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

Grok能够自动将日志数据映射到Elasticsearch。 这样可以更轻松地管理日志并快速实现查询、统计、分析操作。


7、小结

这是一篇翻译文章。当近期在尝试写类似解析文章的时候,发现国外已经有讲解的非常透彻的文章。

因此,在原文基础上做了实践验证和通俗化的解读,希望对你有帮助。

划重点:Grok Debugger和Grok Patterns工具的使用,会事半功倍,极大提高开发效率,避免不必要的“黑暗中摸索”。

思考:如果内置的grok pattern和自定义的pattern都不能满足已有复杂日志的匹配?我们该如何处理呢?

欢迎留言,写下你的思考。相信深度的思考,能提升你的技术认知!


原文地址:https://hackernoon.com/structuring-unstructured-data-with-grok-bcdbb240fcd1

推荐阅读:https://www.elastic.co/cn/blog/do-you-grok-grok

相关文章
|
6月前
|
Go 索引
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
掌握Go语言:Go语言范围,优雅遍历数据结构,简化代码操作实战解析(24)
|
25天前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
57 2
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
381 8
|
3月前
|
存储 算法 Java
"解锁Java对象数据结构的奥秘:从基础到实战,与热点技术共舞,让你的编程之路更激情四溢!"
【8月更文挑战第21天】Java以对象为核心,它是程序的基本单元与数据处理的基础。对象源自类,拥有属性(字段)和方法。对象在内存中分为对象头(含哈希码、GC信息等)和实例数据区(存储属性值)。例如,`Student`类定义了姓名、年龄等属性及相应的方法。通过`new`关键字实例化对象并调用其方法进行数据操作,是Java编程的关键技能。
31 0
|
4月前
|
算法 数据挖掘 计算机视觉
Python并查集实战宝典:从入门到精通,让你的数据结构技能无懈可击!
【7月更文挑战第17天】并查集,如同瑞士军刀,是解决元素分组问题的利器,应用于好友关系、像素聚类、碰撞检测和连通性分析等场景。本文从基础到实战,介绍并查集的初始化、查找与路径压缩、按秩合并,以及在Kruskal算法中的应用。通过并查集,实现高效动态集合操作,对比哈希表和平衡树,其在合并与查找上的性能尤为突出。学习并查集,提升算法解决复杂问题的能力。
77 5
|
4月前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
190 1
|
6月前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
68 1
C语言数据结构算法,常用10种排序实战
|
4月前
|
存储 算法 安全
解锁Python高级数据结构新姿势:堆与优先队列的实战演练,让你的代码更优雅!
【7月更文挑战第8天】Python的`heapq`模块和`queue.PriorityQueue`提供堆与优先队列功能,用于高效数据管理。堆是完全二叉树,`heapq`实现最小堆,常用于任务调度,如按优先级执行任务。当需要线程安全且更复杂操作时,`queue.PriorityQueue`成为优选,例如在管理网络请求时按优先级处理。这两个数据结构能提升代码效率和可读性。
39 0
|
5月前
|
存储 Java 数据处理
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【6月更文挑战第18天】在Java中,HashMap基于哈希表提供快速的键值对操作,适合无序数据;而TreeMap利用红黑树保证排序,适用于有序场景。示例展示了HashMap如何存储并查找用户信息,以及TreeMap如何按员工编号排序存储员工名。两者在不同需求下优化了数据处理。
153 0
|
6月前
|
存储 NoSQL Redis
Redis数据结构精讲:选择与应用实战指南
Redis数据结构精讲:选择与应用实战指南
1323 1