首页 > 其他分享 >Logstash自定义正则表达式ETL实战

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

时间:2024-01-04 11:33:33浏览次数:36  
标签:body Grok Oniguruma 自定义 正则表达式 user Logstash ETL

0、题记

本文建立在干货 | Logstash Grok数据结构化ETL实战上,并专注于在Grok中使用自定义正则表达式。

有时Logstash没有我们需要的模式。幸运的是,我们有正则表达式库:Oniguruma。

Oniguruma是一个灵活的正则表达式库。 它包含多种语言的不同正则表达式实现的特性。

Github地址:https://github.com/kkos/oniguruma

1、基础再认知

  1. Logstash:一个服务器端数据处理管道,它同时从多个源中提取数据,对其进行转换,然后将其发送到Elasticsearch“存储”。
  2. Grok:Logstash中的过滤器,用于将非结构化数据解析为结构化和可查询的数据。
  3. 正则表达式:定义搜索模式的字符序列。

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

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

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

2.1 Grok

grok语法如下:

1%{SYNTAX:SEMANTIC}

Syntax: 默认的grok模式
Semantic: 是关键词。
这样写很枯燥,实践一把。

2.2 Oniguruma

oniguruma语法如下:

1(?<field_name>the pattern here)

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

2.3 Grok + Oniguruma

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

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

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

3、实践一把

3.1 样例数据

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

1production 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\"}

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。

上面的模式产生了结果:

1{
 2  "environment": [
 3    [
 4      "production"
 5    ]
 6  ],
 7  "method": [
 8    [
 9      "GET"
10    ]
11  ],
12  "url": [
13    [
14      "/v2/blacklist/"
15    ]
16  ],
17  "response_status": [
18    [
19      "200"
20    ]
21  ],
22  "BASE10NUM": [
23    [
24      "200"
25    ]
26  ],
27  "response_time": [
28    [
29      "24ms"
30    ]
31  ],
32  "user_id": [
33    [
34      "5ba9e948801d34906b96e0c20"
35    ]
36  ]
37}

这并不完整。 user_agent和req.body没有映射。
要提取user_agent和req.body,我们需要仔细检查它的结构。

3.4 空白分隔符

1 GET /v2/blacklist/ 200 24ms 5ba9e948801d34906b96e0c20

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

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

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

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

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

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

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

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

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


谷歌搜索“regex match everything until character” 找到解决问题的正则思路:
https://stackoverflow.com/questions/2013124/regex-matching-up-to-the-first-occurrence-of-a-character/2013150#2013150

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

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

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

3.5 全部放在一起

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

4、更新Logstash.conf验证

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

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

贴上正则部分内容:

1input { 
 2  file {
 3    path => "/your_logs/*.log"
 4  }
 5}
 6filter{
 7  grok {
 8    match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id} (?<user_agent>[^{]*) %{GREEDYDATA:body}"}
 9  }
10}
11output {
12  elasticsearch {
13    hosts => [ "localhost:9200" ]
14  }
15}

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

1sudo service logstash restart
2sudo service logstash status

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

5、小结

  • Oniguruma + Grok 组合实现自定义解析规则。Logstash文本模式的灵活性和可定制性使其成为构建非结构化日志的理想选择(只要数据结构具有可预测性)。
  • 尝试在Logstash中结合Oniguruma实现自定义解析,提升解析的细化粒度。


标签:body,Grok,Oniguruma,自定义,正则表达式,user,Logstash,ETL
From: https://blog.51cto.com/u_64214/9097609

相关文章

  • 让数据同步纵享丝滑,ETLCloud安装指南
    经常会有小伙伴问如何安装运行ETLCloud?以Windows全量安装为例,现在来讲一下如何操作,还有一些要注意的事项。1.下载打开ETLCloud官网,点击软件下载选择对应的版本,点击下载一些版本有多个下载通道,速度不佳时,可以切换通道2.环境准备点击查看安装说明3.安装准备1.1 服务器硬件环境要求Re......
  • [Android] 如何把自定义的 可执行文件/库文件/apk 放到系统目录下
    找到源码目录device/......./<devicename>/<devicename>.mk,以waydroid为例:/device/waydroid/waydroid/waydroid_arm64打开如下文件: lineage_waydroid_arm64.mk添加PRODUCT_PACKAGES变量到上述文件中,比如:PRODUCT_PACKAGES+=可执行文件名/动态库名字/静态库文件名字/apk文件名......
  • 如何在使用logstash导出的时候,包含索引名称和_id
    这里,我的需求是,把es中的数据导出到本地文件中,一行一个json。我还需要把原来数据中的_id保存下来,在新的集群中导入的时候,指定_id。这里有一个配置文件!logstash配置文件如下#SampleLogstashconfigurationforcreatingasimple#Beats->Logstash->Elasticsearchpipeline.......
  • windows下logstash从文件中读数据写入es报错 Error: No such file or directory - :/d
    [2023-12-22T17:26:50,327][ERROR][logstash.javapipeline][main][897a6c7006446c97daa2ee44df7541701882ceece289ce428fcfac8aa982a0c5]Apluginhadanunrecoverableerror.Willrestartthisplugin.Pipeline_id:mainPlugin:<LogStash::Inputs::Filestar......
  • 数据从A集群,使用logstash迁移到B集群,如何保持_Id一致
    有时候,我们在跨集群数据同步的时候,需要保持_id一致。这里给出一个案例。这里直接给出一个配置文件input{elasticsearch{hosts=>"es.production.mysite.org"index=>"mydata-2018.09.*"query=>'{"query":{"query_string&qu......
  • EasyCVR自定义协议添加步骤
    有用户在使用EasyCVR平台时,想添加自身的自定义协议,不知如何操作。收到用户请求后,技术人员立即对用户进行反馈,以下为具体步骤:1、首先在添加设备中选择GM设备,并把项目id、身份标识和秘钥传入添加设备的接口中;2、随后再找到添加设备的接口,并写个GM协议接入,来判断上面三个参数是否为空;3......
  • 【C++】STL 容器 - set 集合容器 ⑤ ( 仿函数 functor 简介 | 仿函数 functor 调用 |
    文章目录一、仿函数functor1、仿函数functor简介2、仿函数functor调用3、代码示例-仿函数functor调用二、为自定义类元素设置排序规则-仿函数functor1、自定义类排序规则2、仿函数-实现自定义类排序规则3、重载<运算符函数-实现自定义类排序规则一、仿函数fu......
  • 【C++】STL 容器 - set 集合容器 ④ ( 设置 set 集合容器的排序规则 | 默认的 set 集
    文章目录一、设置set集合容器的排序规则1、默认的set集合容器-从小到大排列2、设置set集合容器从大到小排列二、使用仿函数自定义set集合容器排序规则1、仿函数概念2、使用仿函数实现set集合容器排序规则一、设置set集合容器的排序规则1、默认的set集合容器-......
  • 跳转链接 下载链接 自定义处理 XMLHttpRequest 对象来发起 HTTP 请求
    import{saveAs}from'file-saver';/***@description:JavaScript动态生成的a标签进行下载,*********可以使用XMLHttpRequest对象来发起HTTP请求,并在请求完成后获取响应数据*@param{*}url请求地址*@param{*}isOpenNew是否打开新标签页*......
  • 鸿蒙自定义弹窗中的变量如何传递给页面
    鸿蒙自定义弹窗中的变量如何传递给页面作者:坚果团队:坚果派公众号:“大前端之旅”团队介绍:坚果派由坚果创建,团队拥有8个华为HDE,3个HSD,以及若干其他领域的三十余位万粉博主运营。本人为华为HDE、中国计算机学会CCF专业会员、OpenHarmony布道师、开发者联盟优秀讲师、2023年开源之夏......