本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Grok 模式与 Amazon Ingestion OpenSearch 相匹配
Amazon OpenSearch Ingestion 为 Grojava-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
密钥中查找值并尝试匹配模式。插件中内置了关键字 IPORHOST
、HTTPDATE
和 NUMBER
。
当传入的记录与模式匹配时,将生成如下所示的内部事件,其中包含从原始消息中提取的识别密钥。
{ "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
捕获目前显示为新密钥,还有一些未命名的内部捕获,例如 MONTH
和 YEAR
。HTTPDATE
关键字使用这些模式,您可以在默认模式文件中进行查看。
覆盖密钥
如果存在具有相同密钥值的捕获,则纳入 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-1
和 CUSTOM_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" } }