文本处理
OpenSearch Data Prepper 提供文本处理功能,其通过 grok 处理器
实现。该 grok
处理器基于 java-grok
库,并支持所有兼容的模式。java-grok
库是使用 java.util.regex
正则表达式库构建的。
您可以使用 patterns_definitions
选项将自定义模式添加到您的管道中。调试自定义模式时,Grok 调试器会很有帮助。
基本用法
要开始文本处理,请创建以下管道
patten-matching-pipeline:
source
...
processor:
- grok:
match:
message: ['%{IPORHOST:clientip} \[%{HTTPDATE:timestamp}\] %{NUMBER:response_status:int}']
sink:
- opensearch:
# Provide an OpenSearch cluster endpoint
传入消息可能包含以下内容
{"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
配置指定要将哪些记录键与哪些模式匹配。
在以下示例中,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: "grokked"
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"
}
}