Elasticsearch:在 ES|QL 中使用 DISSECT 和 GROK 进行数据处理

目录

DISSECT 还是 GROK? 或者两者兼而有之?

使用 DISSECT 处理数据

Dissect pattern

术语

例子

DISSECT 关键修饰符

右填充修饰符 (->)

附加修饰符 (+)

添加顺序修饰符(+ 和 /n)

命名的跳过键(?)

参考键(* 和 &)

使用 GROK 处理数据

Grok pattern

正则表达式

例子

Grok 调试器

局限性


你的数据可能包含你想要结构化的非结构化字符串。 这使得分析数据变得更加容易。 例如,日志消息可能包含你想要提取的 IP 地址,以便你可以找到最活跃的 IP 地址。

对于使用过 Logstash 及 Ingest pipeline 的开发者来说,DISSECT 及 GROK 对你们来说并不陌生。你可以参阅如下的文章:

  • Elasticsearch:深入理解 Dissect ingest processor

  • Elasticsearch:Dissect 和 Grok 处理器之间的区别

  • Logstash:使用 dissect 导入 CSV 格式文档

  • Logstash:日志解析的 Grok 模式示例

Elasticsearch 可以在索引时或查询时构建数据。 在索引时,你可以使用 Dissect 和 Grok 摄取处理器,或 Logstash Dissect 和 Grok 过滤器。 在查询时,你可以使用 ES|QL DISSECT 和 GROK 命令。

DISSECT 还是 GROK? 或者两者兼而有之?

DISSECT 的工作原理是使用基于分隔符的模式分解字符串。 GROK 的工作原理类似,但使用正则表达式。 这使得 GROK 更强大,但通常也更慢。 当数据可靠地重复时,DISSECT 效果很好。 当你确实需要正则表达式的强大功能时,例如当文本的结构因行而异时,GROK 是更好的选择。

你可以将 DISSECT 和 GROK 用于混合用例。 例如,当一行的一部分可靠地重复时,但整行则不然。 DISSECT 可以解构重复的行条部分。 GROK 可以使用正则表达式处理剩余的字段值。

使用 DISSECT 处理数据

DISSECT 处理命令将字符串与基于分隔符的模式进行匹配,并将指定的键提取为列。

例如,以下模式:

%{clientip} [%{@timestamp}] %{status}

匹配以下格式的日志行:

1.2.3.4 [2023-01-23T12:15:00.000Z] Connected

并将以下列添加到输入表中:

clientip:keyword@timestamp:keywordstatus:keyword

1.2.3.4

2023-01-23T12:15:00.000Z

Connected

Dissect pattern

Dissect pattern 由将被丢弃的字符串部分定义。 在前面的示例中,要丢弃的第一个部分是单个空格。 Dissect 找到这个空间,然后为该空间之前的所有内容分配 clientip 的值。 接下来,dissect 匹配 [ 和 ],然后将 @timestamp 分配给 [ 和 ] 之间的所有内容。 特别注意要丢弃的字符串部分将有助于构建成功的 dissect patterns。

空键 %{} 或
命名的跳过键可用于匹配值,但从输出中排除该值。

所有匹配的值都作为关键字字符串数据类型输出。 使用类型转换函数转换为另一种数据类型。

Dissect 还支持可以更改 dissect 默认行为的键修饰符 (key modifier)。 例如,你可以指示 dissect 忽略某些字段、追加字段、跳过填充等。

术语

名称描述
dissect pattern描述文本格式的字段和分隔符集。 也称为 dissection。 使用一组 %{} 部分来描述 dissection:%{a} - %{b} - %{c}
字段从 %{ 到 }(含)的文本。
分隔符} 和接下来的 %{ 字符之间的文本。 除 %{、'not }' 或 } 之外的任何字符集都是分隔符。
key

%{ 和 } 之间的文本,不包括 ?、+、& 前缀和序数后缀。

例子:

  • %{?aaa} - key 是 aaa
  • %{+bbb/3} - key 是 bbb
  • %{&ccc} - key 是 ccc

例子

以下示例解析包含时间戳、一些文本和 IP 地址的字符串:

ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1"
| DISSECT a "%{date} - %{msg} - %{ip}"
| KEEP date, msg, ip
date:keywordmsg:keywordip:keyword

2023-01-23T12:15:00.000Z

some text

127.0.0.1

默认情况下,DISSECT 输出 keyword 字符串列。 要转换为其他类型,请使用类型转换函数:

ROW a = "2023-01-23T12:15:00.000Z - some text - 127.0.0.1"
| DISSECT a "%{date} - %{msg} - %{ip}"
| KEEP date, msg, ip
| EVAL date = TO_DATETIME(date)
msg:keywordip:keyworddate:date

some text

127.0.0.1

2023-01-23T12:15:00.000Z

DISSECT 关键修饰符

键修饰符可以更改 dissect 的默认行为。 键修饰符可能位于 %{keyname} 的左侧或右侧,且始终位于 %{ 和 } 内。 例如 %{+keyname ->} 具有追加和右填充修饰符。

Dissect key 修饰符
ModifierNamePositionExampleDescriptionDetails

->

Skip right padding

(far) right

%{keyname1->}

向右跳过所有重复的字符

link

+

Append

left

%{+keyname} %{+keyname}

将两个或多个字段附加在一起

link

+ with /n

Append with order

left and right

%{+keyname/2} %{+keyname/1}

按指定的顺序将两个或多个字段附加在一起

link

?

Named skip key

left

%{?ignoreme}

跳过输出中的匹配值。 与 %{} 相同的行为

link

* and &

Reference keys

left

%{*r1} %{&r1}

将输出键设置为 * 值和 & 输出值

link

右填充修饰符 (->)

执行解析的算法非常严格,因为它要求模式中的所有字符都与源字符串匹配。 例如,模式 %{fookey} %{barkey} (1 个空格)将匹配字符串 “foo bar”(1 个空格),但不会匹配字符串“foo. bar”(2 个空格),因为该模式只有 1 个空格,源字符串有 2 个空格。

正确的填充修饰符有助于解决这种情况。 将右侧填充修饰符添加到模式 %{fookey->} %{barkey},现在它将匹配“foo bar”(1 个空格)和 “foo bar”(2 个空格),甚至“foo          bar”(10 个空格) )。

使用右侧填充修饰符以允许在 %{keyname->} 之后重复字符。

右填充修饰符可以与任何其他修饰符一起放置在任何键上。 它应该始终是最右边的修饰符。 例如:%{+keyname/1->} 和 %{->}

右填充修饰符示例:

Pattern

%{ts->} %{level}

Input

1998-08-10T17:15:42,466          WARN

Result

  • ts = 1998-08-10T17:15:42,466
  • level = WARN

右侧填充修饰符可以与空键一起使用,以帮助跳过不需要的数据。 例如,相同的输入字符串,但用括号括起来,需要使用空的右填充键来实现相同的结果。

带有空键的右填充修饰符示例

Pattern

[%{ts}]%{->}[%{level}]

Input

[1998-08-10T17:15:42,466]            [WARN]

Result

  • ts = 1998-08-10T17:15:42,466
  • level = WARN

附加修饰符 (+)

Dissect 支持将两个或多个结果附加在一起以进行输出。 值从左到右附加。 可以指定附加分隔符。 在此示例中,append_separator 被定义为空格。

附加修饰符示例:

Pattern

%{+name} %{+name} %{+name} %{+name}

Input

john jacob jingleheimer schmidt

Result

  • name = john jacob jingleheimer schmidt

添加顺序修饰符(+ 和 /n)

Dissect 支持将两个或多个结果附加在一起以进行输出。 值根据定义的顺序 (/n) 附加。 可以指定附加分隔符。 在此示例中,append_separator 被定义为逗号。

附加顺序修饰符示例:

Pattern

%{+name/2} %{+name/4} %{+name/3} %{+name/1}

Input

john jacob jingleheimer schmidt

Result

  • name = schmidt,john,jingleheimer,jacob

命名的跳过键(?)

Dissect 支持忽略最终结果中的匹配项。 这可以使用空键 %{} 来完成,但为了可读性,可能需要为该空键命名。

命名的跳过键修饰符示例:

Pattern

%{clientip} %{?ident} %{?auth} [%{@timestamp}]

Input

1.2.3.4 - - [30/Apr/1998:22:00:52 +0000]

Result

  • clientip = 1.2.3.4
  • @timestamp = 30/Apr/1998:22:00:52 +0000

参考键(* 和 &)

Dissect 支持使用解析值作为结构化内容的 key/value。 想象一个部分记录 key/value 对的系统。 引用键允许你维护该键/值关系。

参考键修饰符示例:

Pattern

[%{ts}] [%{level}] %{*p1}:%{&p1} %{*p2}:%{&p2}

Input

[2018-08-10T17:15:42,466] [ERR] ip:1.2.3.4 error:REFUSED

Result

  • ts = 2018-08-10T17:15:42,466
  • level = ERR
  • ip = 1.2.3.4
  • error = REFUSED

使用 GROK 处理数据

GROK 处理命令将字符串与基于正则表达式的模式进行匹配,并将指定的键提取为列。

例如,以下模式:

%{IP:ip} \[%{TIMESTAMP_ISO8601:@timestamp}\] %{GREEDYDATA:status}

匹配以下格式的日志行:

1.2.3.4 [2023-01-23T12:15:00.000Z] Connected

并将以下列添加到输入表中:

@timestamp:keywordip:keywordstatus:keyword

2023-01-23T12:15:00.000Z

1.2.3.4

Connected

Grok pattern

Grok 模式的语法是 %{SYNTAX:SEMANTIC}

SYNTAX 是与你的文本匹配的模式的名称。 例如,3.44 通过 NUMBER 模式匹配,55.3.244.1 通过 IP 模式匹配。 语法就是你如何匹配。

语义是你为匹配的文本片段提供的标识符。 例如,3.44 可能是事件的持续时间,因此你可以将其简称为 duration。 此外,字符串 55.3.244.1 可以标识发出请求的 client。

默认情况下,匹配的值作为关键字字符串数据类型输出。 要转换语义的数据类型,请在其后面加上目标数据类型的后缀。 例如 %{NUMBER:num:int},它将 num 语义从字符串转换为整数。 目前唯一支持的转换是 int 和 float。 对于其他类型,请使用类型转换函数。

有关可用模式的概述,请参阅 GitHub。 你还可以使用 REST API 检索所有模式的列表。

正则表达式

Grok 基于正则表达式。 任何正则表达式在 grok 中也有效。 Grok 使用 Oniguruma 正则表达式库。 有关完整支持的正则表达式语法,请参阅 Oniguruma GitHub 存储库。

注意:特殊的正则表达式字符如 [ 和 ] 需要用 \ 转义。 例如,在之前的模式中:

%{IP:ip} \[%{TIMESTAMP_ISO8601:@timestamp}\] %{GREEDYDATA:status}

在 ES|QL 查询中,反斜杠字符本身是一个特殊字符,需要用另一个 \ 进行转义。 对于此示例,相应的 ES|QL 查询变为:

ROW a = "1.2.3.4 [2023-01-23T12:15:00.000Z] Connected"
| GROK a "%{IP:ip} \\[%{TIMESTAMP_ISO8601:@timestamp}\\] %{GREEDYDATA:status}"

定制 patterns

如果 grok 没有你需要的模式,你可以使用 Oniguruma 语法进行命名捕获,它可以让你匹配一段文本并将其保存为一列:

(?<field_name>the pattern here)

例如,postfix 日志的 queue id 是 10 或 11 个字符的十六进制值。 可以使用以下命令将其捕获到名为 queue_id 的列中:

(?<queue_id>[0-9A-F]{10,11})

例子

以下示例解析包含时间戳、IP 地址、电子邮件地址和数字的字符串:

ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42"
| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num}"
| KEEP date, ip, email, num
date:keywordip:keywordemail:keywordnum:keyword

2023-01-23T12:15:00.000Z

127.0.0.1

some.email@foo.com

42

默认情况下,GROK 输出关键字字符串列。 int 和 float 类型可以通过将 :type 附加到模式中的语义来转换。 例如 {NUMBER:num:int}:

ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42"
| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}"
| KEEP date, ip, email, num
date:keywordip:keywordemail:keywordnum:integer

2023-01-23T12:15:00.000Z

127.0.0.1

some.email@foo.com

42

对于其他类型转换,请使用类型转换函数:

ROW a = "2023-01-23T12:15:00.000Z 127.0.0.1 some.email@foo.com 42"
| GROK a "%{TIMESTAMP_ISO8601:date} %{IP:ip} %{EMAILADDRESS:email} %{NUMBER:num:int}"
| KEEP date, ip, email, num
| EVAL date = TO_DATETIME(date)
ip:keywordemail:keywordnum:integerdate:date

127.0.0.1

some.email@foo.com

42

2023-01-23T12:15:00.000Z

Grok 调试器

要编写和调试 grok 模式,你可以使用 Grok 调试器。 它提供了一个用于根据示例数据测试模式的 UI。 在幕后,它使用与 GROK 命令相同的引擎。

局限性

GROK 命令不支持配置自定义模式或多个模式。 GROK 命令不受 Grok 看门狗设置的约束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/183523.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM之Prompt(一):5个Prompt高效方法在文心一言3.5的测试对比

在Effective Prompt: 编写高质量Prompt的14个有效方法文中我们了解了14个编写Prompt的方法&#xff08;非常感谢原作者&#xff09;&#xff0c;那么这些Prompt在具体大模型中的效果如何呢&#xff1f;本文以百度文心一言3.5版本大模型在其中5个方法上做个测试对比。 第1条&am…

MySQL复习总结(二):进阶篇(索引)

文章目录 一、存储引擎1.1 MySQL体系结构1.2 存储引擎介绍1.3 存储引擎特点1.4 存储引擎选择 二、索引2.1 基本介绍2.2 索引结构2.3 索引分类2.4 索引语法2.5 SQL性能分析2.6 索引使用2.6.1 最左前缀法则2.6.2 范围查询2.6.3 索引失效情况2.6.4 SQL提示2.6.5 覆盖索引2.6.6 前缀…

linux中if条件判断,case...esac,function学习

第一、 if [ 判断式 ] ; then fi 注意&#xff1a;中括号和判断式之间的空格&#xff0c;否则会报错&#xff0c;上案例 第二个图的12行&#xff0c;中括号和条件判断如果没有空格&#xff0c;则会提示缺号‘】’&#xff0c;如第二个图最上面的提示。所以使用中括号的格式…

ts学习01-开发环境搭建

环境 nodejs 18 npm 安装typescript npm install typescript # 如果上面太慢&#xff0c;可以执行下面的方法 npm install typescript --registryhttps://registry.npm.taobao.orgHelloWorld 新建index.ts console.log("hello ts");执行下面命令进行编译 npx t…

GPT-4V:AI在教育领域的应用

OpenAI于9月25日发布了最新的GPT-4V模型&#xff0c;为ChatGPT引入了语音和图像功能&#xff0c;为用户提供更多元化的使用方式。这次更新将为用户带来更便捷、直观的交互体验&#xff0c;用户可以直接拍照上传并针对照片内容提出问题。OpenAI的最终目标是构建安全、有益的人工…

2.3 - 网络协议 - ICMP协议工作原理,报文格式,抓包实战

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 ICMP协议 1、ICMP协议工作原理2、ICMP协议报文格式…

Linux网络编程04

更高效的零拷贝 发送方过程零拷贝 sendfile 发送文件方的零拷贝&#xff0c;虽然之前我们就可以使用mmap来实现零拷贝但是存在一个方法sendfile也可以直接实现数据从内核区发送到网络发送区socket 直接把内核里面你的文件数据不经过用户态&#xff0c;直接发送给另外一个文件…

如何对ppt文件设置修改权限?

PPT文件会应用在会议、演讲、课件等工作生活中&#xff0c;当我们制作好了PPT之后&#xff0c;保护内容防止在演示时出错是很重要的&#xff0c;那么如何将PPT文件设置成禁止修改模式呢&#xff1f;今天分享几个方法给大家。 方法一 将PPT文件直接保存或者另存为一份文件&…

C++入门学习(1)命名空间和输入输出

前言 在C语言和基本的数据结构学习之后&#xff0c;我们终于迎来了期待已久的C啦&#xff01;C发明出来的意义就是填补一些C语言的不足&#xff0c;让我们更加方便的写代码&#xff0c;所以今天我们就来讲一下C语言不足的地方和在C中的解决办法&#xff01; 一、命名空间 在学习…

前端框架Vue学习 ——(五)前端工程化Vue-cli脚手架

文章目录 Vue-cliVue项目-创建Vue项目-目录结构Vue项目-启动Vue项目-配置端口Vue项目开发流程 Vue-cli 介绍&#xff1a;Vue-cli 是 Vue 官方提供的一个脚手架&#xff0c;用于快速生成一个 Vue 的项目模版 安装 NodeJS安装 Vue-cli npm install -g vue/cliVue项目-创建 图…

嬴图 | LLM+Graph:大语言模型与图数据库技术的协同

前言 2022年11月以来&#xff0c;大语言模型席卷全球&#xff0c;在自然语言任务中表现卓越。尽管存在一系列伦理、安全等方面的担心&#xff0c;但各界对该技术的热情和关注并未减弱。 本文不谈智能伦理方面的问题&#xff0c;仅集中于Ulitpa嬴图在应用中的一些探索与实践&a…

01-单节点部署clickhouse及简单使用

1、下载rpm安装包&#xff1a; 官网&#xff1a;https://packages.clickhouse.com/rpm/stable/ clickhouse19.4版本之后只需下载3个rpm安装包&#xff0c;上传到节点目录即可 2、rpm包安装&#xff1a; 安装顺序为conmon->server->client 执行 rpm -ivh ./clickhouse-…

【深度学习 AIGC】stable diffusion webUI 使用过程,参数设置,教程,使用方法

文章目录 docker快速启动vae.ckpt或者.safetensorsCFG指数/CFG Scale面部修复/Restore facesRefinerTiled VAEClip Skipprompt提示词怎么写roop Upscaler visibility (if scale 1) docker快速启动 如果你想使用docker快速启动这个项目&#xff0c;你可以按下面这么操作&#…

(Git)git clone报错——SSL certificate problem: self signed certificate

(Git)git clone报错——SSL certificate problem: self signed certificate 克隆代码时报错 问题分析 提示信息为SSL认证失败&#xff0c;可以关闭SSL的认证。 公司bitbucket只支持https地址&#xff0c;需要client配置忽略https证书检验。 解决方法 在克隆前输入下边命令&…

Linux学习第35天:Linux LCD 驱动实验(二):星星之火可以燎原

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 三、LCD驱动程序编写 需要注意的地方&#xff1a; ①、 LCD 所使用的 IO 配置。 ②、 LCD 屏幕节点修改&#xff0c;修改相应的属性值&#xff0c;换成我们所使…

Spring Data Redis + RabbitMQ - 基于 string + hash 实现缓存,计数(高内聚)

目录 一、Spring Data Redis 1.1、缓存功能(分析) 1.2、案例实现 一、Spring Data Redis 1.1、缓存功能(分析) hash 类型存储缓存相比于 string 类型就有更多的更合适的使用场景. 例如,我有以下这样一个 UserInfo 信息 假设这样一个场景就是:万一只想获取其中某一个…

利用shp文件构建mask【MATLAB和ARCGIS】两种方法

1 ARCGIS &#xff08;推荐&#xff01;&#xff01;&#xff01;-速度很快&#xff09; 利用Polygon to Raster 注意&#xff1a;由于我们想要的mask有效值是1&#xff0c;在进行转换的时候&#xff0c;注意设置转换字段【Value field】 【Value field】通过编辑shp文件属性表…

centos 7部署Mysql8.0主从

Mysql官网中关于部署主从的网址 环境准备&#xff1a; 搭建虚拟机和安装Mysql之前的文章中已经涉及&#xff0c;在此不再赘述。 主从IPMysql账号密码主192.168.213.4root/Root1234!从192.168.213.5root/Root1234! 1、主数据库设置 配置my.cnf 一般存放于/etc/。 主从配…

【git】TortoiseGit图标不显示 及 文件夹中.git文件夹不显示

&#xff08;一&#xff09;文件夹中.git文件夹不显示 在 文件夹选项-查看-高级设置 中&#xff0c; 将 隐藏文件和文件夹中的不显示&#xff0c;标记为“显示隐藏的文件、文件夹和驱动器” &#xff08;二&#xff09;TortoiseGit图标不显示 【情况一】是否有正确安装 Tort…

inne所属公司抢注“童年时光”商标仍被冻结

根据中国商标网查询&#xff0c;国家知识产权局已于2023年3月10日裁定&#xff0c;被告inne所属的南京童年时光生物技术有限公司注册的“童年时光”商标无效。随着这起保健品行业品牌资产争夺事件的发酵&#xff0c;更多的细节得到披露&#xff0c;至此&#xff0c;一个从“代理…