添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文建立在 干货 | 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索引!
在这里插入图片描述

  • Oniguruma + Grok 组合实现自定义解析规则。 Logstash文本模式的灵活性和可定制性使其成为构建非结构化日志的理想选择(只要数据结构具有可预测性)。
  • 尝试在Logstash中结合Oniguruma实现自定义解析,提升解析的细化粒度。
  • 在这里插入图片描述
    铭毅天下——Elasticsearch基础、进阶、实战第一公众号
可以为每个正则表达式对象指定字符编码。 支持的字符编码: ASCII,UTF-8,UTF-16BE,UTF-16LE,UTF-32BE,UTF-32LE,EUC-JP,EUC-TW,EUC-KR,EUC-CN,Shift_JIS,Big5,GB18030,KOI8-R,CP1251, ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,ISO- 8859-9,ISO-8859-10,ISO-8859-11,ISO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16 GB18030:久保竹宏贡献 CP1251:由字节贡献 doc / SYNTAX.md:由seanofw提供 新的API:ONIG_SYNTAX_PYTHON 新的API:ONIG_OPTION_IGNORECASE_IS_ASC 配置语法logstash主要配置input、filter、output区段Logstash用{}来定义区域。区域内可以包括插件去预定义,可以在一个区域内定义多个插件。插件区域则可以定义键值对来设置。示例:input { stdin{} syslog{}}数据类型Logstash支持少量的数据值类型:•booldebug => true•stringhost => "loc... Logstash 是一个灵活的、开源的数据收集、丰富和传输管道,旨在高效处理日志、事件和非结构化数据源的不断增长,以便将其分发到各种输出,包括 Elasticsearch。和 ELK(ElasticSearch+Logstash+Kibana) 构建日志系统。1、遗憾的是,此插件仅支持 logstash 版本 (1.5+, 2.1]嗯,这是个问题... 似乎我们应该另辟蹊径 ==!注意:默认情况下,它有一个名为。最后,启动 logstash。2、在安装此插件之前,您应该。编辑完成后,我们应该。 一、oniguruma是什么? oniguruma是一个处理正则表达式的库,我们之所以需要安装它,是因为在安装php7.4的过程,mbstring的正则表达式处理功能对这个包有依赖性,所以我们要先安装这个库。 开源源码地址: https://github.com/liuhongdi/ 二、下载解压配置与安装 安装依赖包 yum install autoconf automake libtool -y wget https://github.com/kkos/oniguruma/ar 日志分析是ELK起家的最核心业务场景之一。 如果你正在使用Elastic Stack并且正尝试将自定义Logstash日志映射到Elasticsearch,那么这篇文章适合您。 Logstash写入ES之前的间数据处理过程一般叫做:数据ETL或者数据清洗。 本文重点介绍数据清洗环节的非结构数据转化为结构化数据的——Grok实现。 1、认知前提 老生常谈,夯实基础认知。 ELK Stac... Regular Expressions Grok sits on top of regular expressions, so any regular expressions are valid in grok as well. The regular expression library is Oniguruma, and you can see the full supported regexp syntax on the Oniguruma site. Groks 位于正则表达式之上,因此任何正则