Grok 模式与 Amazon Ingestion OpenSearch 相匹配 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Grok 模式与 Amazon Ingestion OpenSearch 相匹配

Amazon OpenSearch Ingestion 为 Gro k 处理器提供了模式匹配功能。Grok 处理器基于 java-grok 库,支持所有兼容模式。java-grok 库使用 java.util.regex 正则表达式库构建。

您可以使用 patterns_definitions 选项为管道添加自定义模式。当调试自定义模式时,Grok 调试程序可能会有所帮助。

除了以上示例之外,您还可以使用 Apache 日志管道蓝图。有关蓝图的更多信息,请参阅 使用蓝图创建管道

基本用法

要开始使用模式匹配,请创建以下管道:

version: "2" patten-matching-pipeline: source ... processor: - grok: match: message: ['%{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] %{NUMBER:response_status:int}'] sink: - opensearch: # Provide an OpenSearch Service domain endpoint # Enable the 'serverless' flag if the sink is an OpenSearch Serverless collection aws: ... index: "metrics_for_traces" # serverless: true

传入管道的消息可能包含以下内容:

{"message": "127.0.0.1 198.126.12 [10/Oct/2000:13:55:36 -0700] 200"}

管道将在每个传入事件的 message 密钥中查找值并尝试匹配模式。插件中内置了关键字 IPORHOSTHTTPDATENUMBER

当传入的记录与模式匹配时,将生成如下所示的内部事件,其中包含从原始消息中提取的识别密钥。

{ "message":"127.0.0.1 198.126.12 [10/Oct/2000:13:55:36 -0700] 200", "response_status":200, "clientip":"198.126.12", "timestamp":"10/Oct/2000:13:55:36 -0700" }

Grok 处理器的 match 配置指定记录的哪些密钥与哪些模式匹配。

在以下示例中,匹配配置会检查传入日志中是否包含 message 密钥。如果密钥存在,则先将密钥值与 SYSLOGBASE 模式匹配,再与 COMMONAPACHELOG 模式匹配。然后,检查日志中是否包含 timestamp 密钥。如果存在该密钥,则尝试匹配密钥值与 TIMESTAMP_ISO8601 模式。

processor: - grok: match: message: ['%{SYSLOGBASE}', "%{COMMONAPACHELOG}"] timestamp: ["%{TIMESTAMP_ISO8601}"]

默认情况下,插件将持续运行,直至成功找到匹配项。例如,如果 message 密钥值与某种 SYSLOGBASE 模式成功匹配,则插件不会尝试匹配其他模式。如果要将日志与每一种模式进行匹配,请添加 break_on_match 选项。

包括命名捕获和空捕获

在管道配置中纳入 keep_empty_captures 选项,包含空捕获;或者,纳入 named_captures_only 选项,仅包含命名捕获。命名捕获遵循模式 %{SYNTAX:SEMANTIC},而未命名捕获则遵循模式 %{SYNTAX}

例如,您可以修改以上 Grok 配置,从 %{IPORHOST} 模式中删除 clientip

processor: - grok: match: message: ['%{IPORHOST} \[%{HTTPDATE:timestamp}\] %{NUMBER:response_status:int}']

生成的 grok 日志如下所示:

{ "message":"127.0.0.1 198.126.12 [10/Oct/2000:13:55:36 -0700] 200", "response_status":200, "timestamp":"10/Oct/2000:13:55:36 -0700" }

请注意,clientip 密钥已不存在,因为 %{IPORHOST} 模式目前是未命名捕获。

但是,如果将 named_captures_only 设置为 false

processor: - grok: match: named_captures_only: false message: ['%{IPORHOST} \[%{HTTPDATE:timestamp}\] %{NUMBER:message:int}']

生成的 grok 日志如下所示:

{ "message":"127.0.0.1 198.126.12 [10/Oct/2000:13:55:36 -0700] 200", "MONTH":"Oct", "YEAR":"2000", "response_status":200, "HOUR":"13", "TIME":"13:55:36", "MINUTE":"55", "SECOND":"36", "IPORHOST":"198.126.12", "MONTHDAY":"10", "INT":"-0700", "timestamp":"10/Oct/2000:13:55:36 -0700" }

请注意,IPORHOST 捕获目前显示为新密钥,还有一些未命名的内部捕获,例如 MONTHYEARHTTPDATE 关键字使用这些模式,您可以在默认模式文件中进行查看。

覆盖密钥

如果存在具有相同密钥值的捕获,则纳入 keys_to_overwrite 选项,以指定要覆盖记录中哪些现有的密钥。

例如,您可以修改以上 grok 配置,将 %{NUMBER:response_status:int} 替换为 %{NUMBER:message:int},然后将 message 添加到要覆盖的密钥列表中。

processor: - grok: match: keys_to_overwrite: ["message"] message: ['%{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] %{NUMBER:message:int}']

在生成的 grok 日志中,数字 200 将覆盖原始消息。

{ "message":200, "clientip":"198.126.12", "timestamp":"10/Oct/2000:13:55:36 -0700" }

使用自定义模式

在 grok 配置中纳入 pattern_definitions 选项以指定自定义模式。

以下配置创建名为 CUSTOM_PATTERN-1CUSTOM_PATTERN-2 的自定义正则表达式模式。默认情况下,插件将持续运行,直至成功找到匹配项。

processor: - grok: pattern_definitions: CUSTOM_PATTERN_1: 'this-is-regex-1' CUSTOM_PATTERN_2: '%{CUSTOM_PATTERN_1} REGEX' match: message: ["%{CUSTOM_PATTERN_2:my_pattern_key}"]

如果将 break_on_match 指定为 false,则管道尝试匹配所有模式并从传入事件中提取密钥:

processor: - grok: pattern_definitions: CUSTOM_PATTERN_1: 'this-is-regex-1' CUSTOM_PATTERN_2: 'this-is-regex-2' CUSTOM_PATTERN_3: 'this-is-regex-3' CUSTOM_PATTERN_4: 'this-is-regex-4' match: message: [ "%{PATTERN1}”, "%{PATTERN2}" ] log: [ "%{PATTERN3}", "%{PATTERN4}" ] break_on_match: false

您可以自行定义自定义模式,用于管道模式匹配。在上一个示例中,将在匹配自定义模式后提取 my_pattern

使用父密钥存储捕获

在 grok 配置中纳入 target_key 选项,将记录的所有捕获封装到其他外部密钥值中。

例如,您可以修改以上 grok 配置,以添加名为 grokked 的目标密钥。

processor: - grok: target_key: "grok" match: message: ['%{IPORHOST} \[%{HTTPDATE:timestamp}\] %{NUMBER:response_status:int}']

生成的 grok 日志如下所示:

{ "message":"127.0.0.1 198.126.12 [10/Oct/2000:13:55:36 -0700] 200", "grokked": { "response_status":200, "clientip":"198.126.12", "timestamp":"10/Oct/2000:13:55:36 -0700" } }