Link Search Menu Expand Document Documentation Menu

文本处理

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 键中找到值并尝试匹配模式。关键字 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 配置指定要将哪些记录键与哪些模式匹配。

在以下示例中,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: "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"
  }
}
剩余 350 字符

有问题?

想要贡献?