干货 | Logstash自定义正则表达式ETL实战
0、题记
本文建立在干货 | 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}
Syntax: 默认的grok模式
Semantic: 是关键词。
这样写很枯燥,实践一把。
2.2 Oniguruma
oniguruma语法如下:
(?<field_name>the pattern here)
field_name:是关键词。
pattern :这里的模式是你放入正则表达式模式的地方。
2.3 Grok + Oniguruma
您可以将Grok和Oniguruma结合起来,如下所示:
%{SYNTAX:SEMANTIC} (?<field_name>the pattern here)
不好理解?不要担心,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\"}
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"]]
}
这并不完整。 user_agent和req.body没有映射。
要提取user_agent和req.body,我们需要仔细检查它的结构。
3.4 空白分隔符
GET /v2/blacklist/ 200 24ms 5ba9e948801d34906b96e0c20
由空格分隔,这很容易使用。
但是,对于user_agent,根据发送请求的硬件类型,可能存在动态数量的空格。
Panya/1.6.3 (com.sn.panya.host; build:1; iOS 10.3.3) Alamofire/4.66.0
我们如何解释这种不断变化?
提示:看一下req.body的结构。
{\”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
后半部分组合后的正则如下:
(?<user_agent>[^{]*) %{GREEDYDATA:body}
user_agent和req.body将被提取出来。
3.5 全部放在一起
将此应用于grok调试器中的自定义正则表达式模式,得到了我们想要的结果:
4、更新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} (?<user_agent>[^{]*) %{GREEDYDATA:body}"}}
}
output {elasticsearch {hosts => [ "localhost:9200" ]}
}
保存更改后,重新启动Logstash并检查其状态以确保它仍然有效。
sudo service logstash restart
sudo service logstash status
最后,为了确保更改生效,请务必刷新Kibana中Logstash的Elasticsearch索引!
5、小结
- Oniguruma + Grok 组合实现自定义解析规则。 Logstash文本模式的灵活性和可定制性使其成为构建非结构化日志的理想选择(只要数据结构具有可预测性)。
- 尝试在Logstash中结合Oniguruma实现自定义解析,提升解析的细化粒度。
铭毅天下——Elasticsearch基础、进阶、实战第一公众号
干货 | Logstash自定义正则表达式ETL实战相关推荐
- Spring Security 实战干货:自定义异常处理
Spring Security 实战干货:自定义异常处理 转自:https://www.cnblogs.com/felordcn/p/12142514.html 文章目录 1. 前言 2. Sprin ...
- 自定义LLDB命令实战
https://www.jianshu.com/p/63c83290df6d 前言 本文翻译自Custom LLDB Commands in Practice 翻译的不对的地方还请多多包涵指正,谢谢~ ...
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色自定义配置)实战
R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色自定义配置)实战 目录 R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框 ...
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(不同分组配置不同的箱体填充色+自定义调色板)实战
R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(不同分组配置不同的箱体填充色+自定义调色板)实战 目录 R语言使用ggplot2包使用geom_boxplot函数绘制基础分 ...
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义填充色)实战(dot plot)
R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义填充色)实战(dot plot) 目录 R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义填充 ...
- sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss)
sklearn基于make_scorer函数为Logistic模型构建自定义损失函数+代码实战(二元交叉熵损失 binary cross-entropy loss) # 广义线性模型中的各种连接函数: ...
- 玩转springboot:默认静态资源和自定义静态资源实战
点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...
- H5移动端开发基础(三)自定义滚动条、实战-音悦台
自定义滚动条.实战-音悦台 自定义滚动条 js封装 transform.js tween.js scrollBar.js 音悦台 适配 样式 html js 自定义滚动条 *{margin: 0;pa ...
- Spring Security 实战干货:自定义配置类入口 WebSecurityConfigurerAdapter
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 今天我们要进一步的的学习如何自定义配置 Sp ...
最新文章
- POJ2342-Anniversary party-树形DP入门
- Chrome 39-45
- 剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...
- echarts迁徙图 vue_vue中高德搭配echarts做数据迁徙流线图
- go mysql存储过程_Golang 调用MySQL存储过程
- spring-security权限控制详解
- 自定义Cell的流程
- python 批量处理文件_python批量处理文件或文件夹
- 飞桨博士会第四期,中国深度学习技术俱乐部诚邀您加入
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在初始化的时候写入参数
- 电脑太慢了最简单的办法怎么弄_最简单的电脑端微信多开方法
- python用matplotlib或boxplot作图的时候,中文标注无法正常显示,乱码为小方框的解决办法
- 一点浩然气,千里快哉风(修炼孟子浩然之气)
- springboot+vue医院预约挂号系统java
- WIN11win10 使用Anaconda下载Pytorch详细教程(包括换源)
- 网站上线教程(购买域名、主机)
- 如何上传工资表在微信查询---智慧查询
- HAUT 1261 地狱飞龙
- Sensor+ISP专栏-HDR
- Oracle 临时表、数据闪回、查询被锁表、系统常用表、及常用操作