logstash:日志解析的grok模式示例(代码片段)

Elastic中国社区官方博客 Elastic中国社区官方博客     2022-12-03     768

关键词:

如果没有日志解析,搜索和可视化日志几乎是不可能的,一个被低估的技能记录器需要读取他们的数据。 解析结构化你的传入(非结构化)日志,以便用户可以在调查期间或设置仪表板时搜索清晰的字段和值。

最流行的日志解析语言是 Grok。 你可以使用 Grok 插件在各种日志管理和分析工具比如 Elastic Stack 中解析日志数据。 在这里查看我之前的的 Grok 教程

但是用 Grok 解析日志可能会很棘手。 本博客将研究一些 Grok 模式示例,这些示例可以帮助您了解如何解析日志数据。

开始使用 Grok

让我们从一个示例非结构化日志消息开始,然后我们将使用 Grok 模式对其进行结构化:

128.39.24.23 - - [25/Dec/2021:12:16:50 +0000] "GET /category/electronics HTTP/1.1" 200 61 "/category/finance" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"

想象一下搜索数百万条看起来像这样的日志行! 看起来很可怕。 这就是为什么我们有像 Grok 这样的解析语言——让数据更易于阅读和搜索。

查看该数据并使用 Kibana 等分析工具进行搜索的一种更简单的方法是将其分解为具有值的字段,如下表所示:

1. ip:128.39.24.23
2. timestamp:25/Dec/2021:12:16:50 +0000
3. verb:GET
4. request:/category/electronics HTTP/1.1
5. status: 200
6. bytes: 61
7. referrer:/category/finance
8. os: Windows

让我们使用一个示例 Grok 模式来生成这些字段。 以下部分将展示 Grok 模式语法以生成上述每个字段。

对于每个部分,我们的 Grok 模式都会扩展,因为它包含更多要解析的字段。 这些模式是 Grok 可以阅读的正则表达式——我们可以使用它们来表达我们的信息。

下面是一些有用的链接,可以帮助你开始使用一些 Grok 模式。 但我们将在博客的其余部分提供更多示例。

  1. Grok pattern
  2. Grok Debugger

在 Grok pattern 页面,我们可以找到我们需要的预定义好的 pattern:

从某种意义上讲,这些 pattern 在本质上就是基于正则表达式的组合。你也可以创建自己定义的 pattern。这个在我的另外的文章有提到

让我们开始构建 Grok 模式来结构化数据。

我们使用以下方式描述模式的开始: ^
语法如下: %pattern:Name_of_the_field

请注意:不建议使用空格来描述字段的名称。

提取 IP

假设我们要提取 IP,我们可以使用 IP 方法:

^%IP:ip

然后我们有这些: – –

为了告诉 Grok 忽略它们,我们只需将它们添加到我们的模式中。

^%IP:ip - -

这个模式给了我们这个字段:

ip:128.39.24.23

为了测试方便,我们可以使用 Kibana 中所提供的 Grok debugger 来展示:

 

从上面的输出,我们可以看出来  ip 字段被解释。 上面所使用到的 IP pattern,你可以在地址进行查看:

 

提取 timestamps

在我们非结构化日志消息的下一部分中,我们将时间戳 “含” 在一个数组中:

[25/Dec/2021:12:16:50 +0000] 

要提取它,我们需要使用正则表达式和 HTTPDATE 方法,同时在外面添加括号,以便 Grok 知道忽略它们:

\\[%HTTPDATE:timestamp\\]

基于我们之前的模式,我们现在有:

^%IP:ip - - \\[%HTTPDATE:timestamp\\] 

这给了我们:

  "ip": "128.39.24.23",
  "timestamp": "25/Dec/2021:12:16:50 +0000"

回到我们最初的非结构化消息,看起来我们有一个空间,时间戳结束,“GET 开始”。 我们还需要告诉 Grok 忽略空格。 为此,我们只需按键盘上的空格键,或者我们可以使用 %SPACE -> 直到 4 个空格。 

提取 verbs

是时候提取 GET 字段了。 首先,我们需要告诉 Grok 忽略引号 - 然后使用 WORD 方法,我们将通过编写来做到这一点:

“%WORD:verb

所以,现在我们的模式是:

^%IP:ip - - \\[%HTTPDATE:timestamp\\] "%WORD:verb

 这给了我们这些字段:

  "ip": "128.39.24.23",
  "verb": "GET",
  "timestamp": "25/Dec/2021:12:16:50 +0000"

提取 request

为了提取请求 -> /category/electronics HTTP/1.1″,我们需要使用 DATA 方法,它本质上是正则表达式中的通配符。

这意味着我们需要添加一个句号来提取此信息,以告诉 DATA 方法在哪里停止——否则,它不会捕获任何数据。 我们可以使用引号作为停止标记:

%DATA:request"

现在,我们有以下 Grok 模式:

^%IP:ip - - \\[%HTTPDATE:timestamp\\] "%WORD:verb %DATA:request"

这给了我们这些字段:

  "request": "/category/electronics HTTP/1.1",
  "ip": "128.39.24.23",
  "verb": "GET",
  "timestamp": "25/Dec/2021:12:16:50 +0000"

 

提取 status

接下来是状态,但我们在请求结束和状态之间再次有一个空格,我们可以添加一个空格或 %SPACE。 为了提取数字,我们使用 NUMBER 方法。

%NUMBER:status

现在我们的模式扩展到:

^%IP:ip - - \\[%HTTPDATE:timestamp\\] "%WORD:verb %DATA:request" %NUMBER:status

这给了我们如下的字段: 

  "request": "/category/electronics HTTP/1.1",
  "ip": "128.39.24.23",
  "verb": "GET",
  "timestamp": "25/Dec/2021:12:16:50 +0000",
  "status": "200"

提取 Bytes

为了提取字节,我们需要再次使用 NUMBER 方法,但在此之前,我们需要使用常规空格或 %SPACE

^%IP:ip - - \\[%HTTPDATE:timestamp\\] "%WORD:verb %DATA:request" %NUMBER:status %NUMBER:bytes

这给了我们如下的字段: 

  "request": "/category/electronics HTTP/1.1",
  "bytes": "61",
  "ip": "128.39.24.23",
  "verb": "GET",
  "timestamp": "25/Dec/2021:12:16:50 +0000",
  "status": "200"

提取 referrer

要提取 “referrer”,我们需要使用常规空格或 %SPACE -> “ 所以 Grok 会忽略它:

%DATA:referrer"

如你所见,我们添加 DATA 直到它遇到 " 字符:

这给了我们如下的字段:

  "request": "/category/electronics HTTP/1.1",
  "referrer": "",
  "bytes": "61",
  "ip": "128.39.24.23",
  "verb": "GET",
  "timestamp": "25/Dec/2021:12:16:50 +0000",
  "status": "200"

忽略数据及提取 os

现在我们想忽略这个数据 ->” “Mozilla/5.0 (compatible; MSIE 9.0; 为此,我们将使用 “Mozilla/5.0” 的 DATA 方法,但不写入该字段将忽略它。

然后我们将使用不带冒号或字段名的 WORD 方法忽略 (compatible;

最后,我们将使用 DATA 忽略 MSIE 9.0;

这给我们留下了以下模式来忽略该数据

%DATA\\(%WORD;%DATA;

为了进一步解释这种模式......

\\( -> 停止直到它到达 (
; -> 停止直到到达 ;

请注意上面的模式中的 \\( 字符。第一个 DATA 遇到 \\( 即停止,也就是第一个数据。第二个 DATA 停止直到遇到 ; 符号。同样地,第三个 DATA 停止直到遇到 ;

现在我们可以使用 WORD 方法提取 os -> %WORD:os。就是这样! 现在我们剩下以下 Grok 模式来构建我们的数据。

^%IP:ip - - \\[%HTTPDATE:timestamp\\] "%WORD:verb %DATA:request" %NUMBER:status %NUMBER:bytes %DATA:referrer" %DATA\\(%WORD;%DATA; %WORD:os

这为我们提供了这些整洁的字段,我们可以使用这些字段更轻松地搜索和可视化我们的日志数据:

 

  "request": "/category/electronics HTTP/1.1",
  "referrer": "\\"/category/finance",
  "os": "Windows",
  "bytes": "61",
  "ip": "128.39.24.23",
  "verb": "GET",
  "timestamp": "25/Dec/2021:12:16:50 +0000",
  "status": "200"

至此,我们已经完成了对整个日志信息的结构化分析。接下来,你可以参考视频:

Logstash 日志解析的 Grok 模式示例

Logstash 日志解析的 Grok 模式示例_哔哩哔哩_bilibili

来了解如何在 Logstash 或者在 ingest pipeline 中进行使用这个 Grok pattern。

logstash:grok模式示例(代码片段)

Logstash可以轻松解析CSV和JSON文件,因为这些格式的数据组织得很好,可以进行Elasticsearch分析。但是,有时我们需要处理非结构化数据,例如纯文本日志。在这些情况下,我们需要使用LogstashGrok或其他第三方服... 查看详情

logstash:grok模式示例(代码片段)

Logstash可以轻松解析CSV和JSON文件,因为这些格式的数据组织得很好,可以进行Elasticsearch分析。但是,有时我们需要处理非结构化数据,例如纯文本日志。在这些情况下,我们需要使用LogstashGrok或其他第三方服... 查看详情

logstash / grok 模式文件

】logstash/grok模式文件【英文标题】:logstash/grokpatternfile【发布时间】:2015-09-2902:24:38【问题描述】:我正在解析IIS日志,当所有模式都在配置文件中时,我一切正常。我想取出所有模式并将它们放在一个模式文件中,但似乎无... 查看详情

Logstash Grok 解析器

】LogstashGrok解析器【英文标题】:LogstashGrokparser【发布时间】:2015-12-0217:10:00【问题描述】:我是log-stash和grok的新手,我需要解析非常自定义的日志文件。我在任何地方都找不到一个很好的教程来完成这项工作。尝试了syslog示... 查看详情

Logstash 应该只记录 grok 解析的消息

】Logstash应该只记录grok解析的消息【英文标题】:Logstashshouldlogonlygrokparsedmessages【发布时间】:2017-01-1609:54:07【问题描述】:目前我有一个ELK堆栈,其中的日志由filebeat传送,在logstash中的一些过滤器之后,它被转发到ES。由于有... 查看详情

Logstash grok 模式过滤自定义日志消息

】Logstashgrok模式过滤自定义日志消息【英文标题】:LogstashgrokpatterntofiltercustomLogmessage【发布时间】:2015-03-1608:40:25【问题描述】:我是logstash的新手,我想从日志消息中过滤文件。这是日志消息:[2015-03-1613:12:05,130]INFO-LogMediatorSe... 查看详情

logstash笔记-----grok插件的正则表达式来解析日志

(一)简介:   丰富的过滤器插件的存在是logstash威力如此强大的重要因素。名为过滤器,其实提供的不单单是过滤的功能,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的logs... 查看详情

elk日志处理之使用grok解析日志

...。Grok内置了120多种的正则表达式库,地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/ 查看详情

Grok 用于日志文件 Logstash

】Grok用于日志文件Logstash【英文标题】:GrokforlogfilesLogstash【发布时间】:2020-04-2212:03:00【问题描述】:我需要编写一个grok模式来检索“****”中的内容-----Startofscriptforserversitboap1at**FriApr1714:24:19**HKT2020---------**user11**8775110Apr16?00:00... 查看详情

使用 Grok for Logstash 解析 Apache2 错误日志

】使用GrokforLogstash解析Apache2错误日志【英文标题】:ParseApache2ErrorlogswithGrokforLogstash【发布时间】:2013-06-2406:32:12【问题描述】:我正在尝试解析我的apache2错误日志,但遇到了一些麻烦。它似乎与过滤器不匹配。我很确定时间戳... 查看详情

logstash grok 模式来监控 logstash 本身

】logstashgrok模式来监控logstash本身【英文标题】:logstashgrokpatterntomonitorlogstashitself【发布时间】:2016-05-0316:07:48【问题描述】:我想将logstash.log日志添加到我的ELK堆栈中,但我总是遇到grokparsefailure。我的模式在http://grokconstructor.a... 查看详情

logstash grok,用 json 过滤器解析一行

】logstashgrok,用json过滤器解析一行【英文标题】:logstashgrok,parsealinewithjsonfilter【发布时间】:2018-04-2002:54:52【问题描述】:我正在使用ELK(弹性搜索、kibana、logstash、filebeat)来收集日志。我有一个包含以下几行的日志文件,每... 查看详情

logstash:wso api manager 日志到弹性

】logstash:wsoapimanager日志到弹性【英文标题】:logstash:wsoapimanagerlogstoelastic【发布时间】:2022-01-1520:35:00【问题描述】:我的日志如下所示,日志中的每个参数都是静态的。我尝试通过logstash发送弹性并使用Grok模式。但我看不到... 查看详情

未找到 logstash grok 过滤器模式

】未找到logstashgrok过滤器模式【英文标题】:logstashgrokfilterpatternnotfound【发布时间】:2015-04-1419:46:12【问题描述】:我一直在尝试为logstash创建一些自定义的grok模式。他们中的大多数工作正常,但有一个让我难过。模式是:WINUSE... 查看详情

logstash / grok 自定义字段

】logstash/grok自定义字段【英文标题】:logstash/grokcustomfileds【发布时间】:2017-07-1810:37:32【问题描述】:我是ELK堆栈的全新用户。我在从日志中过滤掉特定部分时遇到了一点问题。示例日志:[2017-05-3013:58:09,336]INFO[com.qwerty.test.core... 查看详情

logstash的过滤插件及其应用

一、Logstash的过滤插件数据从源传输到存储库的过程中,Logstash过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便进行更强大的分析和实现商业价值。Logstash能够动态地转换和解析数据,不... 查看详情

logstash:使用自定义正则表达式模式(代码片段)

有时LogstashGrok没有我们需要的模式。幸运的是我们有正则表达式库:Oniguruma。在很多时候,如果Logstash所提供的正则表达不能满足我们的需求,我们选用定制自己的表达式。定义Logstash是一种服务器端数据处理管道ÿ... 查看详情

logstash之grok(代码片段)

nginx匹配示例nginx日志格式\'$remote_user[$time_local]$http_x_Forwarded_for$remote_addr$request$status$upstream_status\'\'$http_x_forwarded_for\'\'$upstream_addr\'\'ups_resp_time:$upstream_response_time\'\'request_time:$request_time\';nginx日志示例-[09/May/2023:15:01:31+0800]11.20.1.3038.... 查看详情