干货 | Logstash自定义正则表达式ETL实战

简介: 本文建立在干货 | Logstash Grok数据结构化ETL实战上,并专注于在Grok中使用自定义正则表达式。有时Logstash没有我们需要的模式。 幸运的是,我们有正则表达式库:Oniguruma。Oniguruma是一个灵活的正则表达式库。 它包含多种语言的不同正则表达式实现的特性。Github地址:https://github.com/kkos/oniguruma

1、基础再认知

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

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

正则表达式:定义搜索模式的字符序列。

如果已经运行了Logstash,则无需安装其他正则表达式库,因为“Grok位于正则表达式之上,因此任何正则表达式在grok中都有效” -

官方文档:https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html


2、正则匹配模式分类解读

2.1 Grok

grok语法如下:


%{SYNTAX:SEMANTIC}

1

Syntax: 默认的grok模式

Semantic: 是关键词。

这样写很枯燥,实践一把。

image.png

2.2 Oniguruma

oniguruma语法如下:


(?<field_name>the pattern here)

1

field_name:是关键词。

pattern :这里的模式是你放入正则表达式模式的地方。


2.3 Grok + Oniguruma

您可以将Grok和Oniguruma结合起来,如下所示:


%{SYNTAX:SEMANTIC} (?<field_name>the pattern here)

1

不好理解?不要担心,2.2和2.3的示例在下面的章节详细解读。


3、实践一把

3.1 样例数据

为了演示如何在Grok中使用Oniguruma,我们将使用下面的日志数据作为示例。


production GET /v2/blacklist/ 200 24ms 5ba9e948801d34906b96e0c20 Panya/1.6.3 (com.sn.panya.host; build:1; iOS 10.3.3) Alamofire/4.66.0 {\"user_id\":\"5bd4c2f4569f470016bd8d55\",\"reason\":\"SPAMMER\"}

1

3.2 结构化日志数据

production == environment

GET == method

/v2/blacklist == url

200 == response_status

24ms == response_time

5bc6e716b5d6cb35fc9687c0 == user_id

Panya/1.6.3 (com.sn.panya.host; build:1; iOS 10.3.3) Alamofire/4.66.0 == user_agent

{“user_id”:“5bd4c2f4569f470016bd8d55”,“reason”:“SPAMMER”} == req.body

3.3 非结构化转化为结构化目标

目标是找到一种模式来构建和解析非结构化日志数据。

为此,我们将使用Grok Debugger和RegExr。

Grok Debugger :https://grokdebug.herokuapp.com/

RegExr:https://regexr.com/


上面的模式产生了结果:


{

 "environment": [

   [

     "production"

   ]

 ],

 "method": [

   [

     "GET"

   ]

 ],

 "url": [

   [

     "/v2/blacklist/"

   ]

 ],

 "response_status": [

   [

     "200"

   ]

 ],

 "BASE10NUM": [

   [

     "200"

   ]

 ],

 "response_time": [

   [

     "24ms"

   ]

 ],

 "user_id": [

   [

     "5ba9e948801d34906b96e0c20"

   ]

 ]

}

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

这并不完整。 user_agent和req.body没有映射。

要提取user_agent和req.body,我们需要仔细检查它的结构。

image.png

3.4 空白分隔符

GET /v2/blacklist/ 200 24ms 5ba9e948801d34906b96e0c20

1

由空格分隔,这很容易使用。

但是,对于user_agent,根据发送请求的硬件类型,可能存在动态数量的空格。


Panya/1.6.3 (com.sn.panya.host; build:1; iOS 10.3.3) Alamofire/4.66.0

1

我们如何解释这种不断变化?

提示:看一下req.body的结构。


{\”user_id\”:\”5bd4c2f4569f470016bd8d55\”,\”reason\”:\”SPAMMER\”}

1

我们可以看到req.body由大括号{}组成。

利用这些知识,我们可以构建一个自定义正则表达式模式,以查找第一个左括号内的所有内容,然后再抓取所有内容。

如下正则的含义是:匹配从开头到“{”的所有字符。

image.png

谷歌搜索“regex match everything until character” 找到解决问题的正则思路:

https://stackoverflow.com/questions/2013124/regex-matching-up-to-the-first-occurrence-of-a-character/2013150#2013150


后半部分组合后的正则如下:


(?<user_agent>[^{]*) %{GREEDYDATA:body}

1

user_agent和req.body将被提取出来。


3.5 全部放在一起

将此应用于grok调试器中的自定义正则表达式模式,得到了我们想要的结果:

image.png

4、更新Logstash.conf验证

在您安装ELK堆栈的服务器上,导航到Logstash配置。


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

1

贴上正则部分内容:


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} (?<user_agent>[^{]*) %{GREEDYDATA:body}"}

 }

}

output {

 elasticsearch {

   hosts => [ "localhost:9200" ]

 }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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


sudo service logstash restart

sudo service logstash status

1

2

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


image.png

相关文章
|
3月前
|
Python Windows
【Python进阶必备】一文掌握re库:实战正则表达式
【Python进阶必备】一文掌握re库:实战正则表达式
62 0
|
2月前
|
自然语言处理 Rust JavaScript
多语言环境下的正则表达式实战:校验整数、小数
多语言环境下的正则表达式实战:校验整数、小数
16 0
|
3月前
|
Python Windows
【Python进阶必备】一文掌握re库:实战正则表达式
【Python进阶必备】一文掌握re库:实战正则表达式
264 0
|
3月前
|
自然语言处理 算法 Python
【Python自然语言处理】正则表达式(RE)的讲解及实战应用(图文解释 附源码)
【Python自然语言处理】正则表达式(RE)的讲解及实战应用(图文解释 附源码)
98 0
|
SQL Linux Shell
正则表达式实战
本文都是基于Linux 支持的正则来实战。关于正则的流派见这里。
124 1
|
索引 Python
Python正则表达式实战案例
Python正则表达式实战案例
|
监控 Java Python
Python 正则表达式实战之Java日志解析
Python 正则表达式实战之Java日志解析
181 0
|
数据采集 Python
常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)
带大家学习正则表达式,并通过python代码举例讲解常用的正则表达式 最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析。
213 0
|
JavaScript 前端开发 Java
JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码(四 | 完结)
我们继续来学习正则表达式吧,没有看过之前文章的小伙伴建议点击上方链接,从第一篇开始看,本系列文章适合从未接触过或不太了解正则表达式的人
210 0