Link Search Menu Expand Document Documentation Menu

日志富化

您可以使用 OpenSearch Data Prepper 执行不同类型的日志丰富,包括:

  • 过滤。
  • 从字符串中提取键值对。
  • 修改事件。
  • 修改字符串。
  • 将列表转换为映射。
  • 处理传入时间戳。

过滤

使用 drop_events 处理器在将特定日志事件发送到接收器之前对其进行过滤。例如,如果您正在收集 Web 请求日志,并且只想存储不成功的请求,则可以创建以下管道,该管道会删除响应小于 400 的任何请求,以便只保留 HTTP 状态代码为 400 及更高的日志事件。

log-pipeline:
  source:
  ...
  processor:
    - grok:
        match:
          log: [ "%{COMMONAPACHELOG_DATATYPED}" ]
    - drop_events:
        drop_when: "/response < 400"
  sink:
    - opensearch:
        ...
        index: failure_logs

drop_when 选项指定要从管道中删除哪些事件。

从字符串中提取键值对

日志数据通常包含键值对字符串。例如,如果用户查询可分页的 URL,HTTP 日志可能包含以下 HTTP 查询字符串:

page=3&q=my-search-term

要使用搜索词进行分析,您可以从查询字符串中提取 q 的值。key_value 处理器为从字符串中提取键和值提供了强大的支持。

以下示例结合了 split_stringkey_value 处理器,用于从 Apache 日志行中提取查询参数:

pipeline:
 ...
  processor:
    - grok:
        match:
          message: [ "%{COMMONAPACHELOG_DATATYPED}" ]
    - split_string:
        entries:
          - source: request
            delimiter: "?"
    - key_value:
        source: "/request/1"
        field_split_characters: "&"
        value_split_characters: "="
        destination: query_params

修改事件

不同的事件修改处理器允许您重命名、复制、添加和删除事件条目。

在此示例中,如果事件中已存在 debug 键,则第一个处理器会将该键的值设置为 true。第二个处理器仅在事件中不存在 debug 键时将其设置为 true,因为 overwrite_if_key_exists 设置为 true

...
processor:
  - add_entries:
      entries:
        - key: "debug"
          value: true 
...
processor:
  - add_entries:
      entries:
        - key: "debug"
          value: true 
          overwrite_if_key_exists: true
...

您还可以使用格式字符串从现有事件构建新条目。例如,${date}-${time} 将根据现有条目 datetime 的值创建新条目。

例如,以下管道会根据现有事件动态添加新的事件条目:

processor:
  - add_entries:
      entries:
        - key: "key_three"
          format: "${key_one}-${key_two}

考虑以下传入事件:

{
   "key_one": "value_one",
   "key_two": "value_two"
}

处理器会将其转换为一个带有新键 key_three 的事件,该键组合了原始事件中其他键的值,如下例所示:

{
   "key_one": "value_one",
   "key_two": "value_two",
   "key_three": "value_one-value_two"
}

修改字符串

各种字符串修改处理器提供了可用于处理传入数据中字符串的工具。例如,如果您需要将字符串拆分为数组,可以使用 split_string 处理器:

...
processor:
  - split_string:
      entries:
        - source: "message"
          delimiter: "&"
...

处理器会将诸如 a&b&c 的字符串转换为 ["a", "b", "c"]

将列表转换为映射

list_to_map 处理器是事件修改处理器之一,可将事件中的对象列表转换为映射。

例如,考虑以下处理器配置:

...
processor:
  - list_to_map:
      key: "name"
      source: "A-car-as-list"
      target: "A-car-as-map"
      value_key: "value"
      flatten: true
...

以下处理器会将包含对象列表的事件转换为如下所示的映射:

{
  "A-car-as-list": [
    {
      "name": "make",
      "value": "tesla"
    },
    {
      "name": "model",
      "value": "model 3"
    },
    {
      "name": "color",
      "value": "white"
    }
  ]
}

{
  "A-car-as-map": {
    "make": "tesla",
    "model": "model 3",
    "color": "white"
  }
}

再例如,考虑一个具有以下结构的传入事件:

{
  "mylist" : [
    {
      "somekey" : "a",
      "somevalue" : "val-a1",
      "anothervalue" : "val-a2"
    },
    {
      "somekey" : "b",
      "somevalue" : "val-b1",
      "anothervalue" : "val-b2"
    },
    {
      "somekey" : "b",
      "somevalue" : "val-b3",
      "anothervalue" : "val-b4"
    },
    {
      "somekey" : "c",
      "somevalue" : "val-c1",
      "anothervalue" : "val-c2"
    }
  ]
}

您可以在处理器配置中定义以下选项:

...
processor:            
  - list_to_map:
      key: "somekey"
      source: "mylist"
      target: "myobject"
      flatten: true
...

处理器通过添加新的 myobject 对象来修改事件:

{
  "myobject" : {
    "a" : [
      {
        "somekey" : "a",
        "somevalue" : "val-a1",
        "anothervalue" : "val-a2"
      }  
    ],
    "b" : [
      {
        "somekey" : "b",
        "somevalue" : "val-b1",
        "anothervalue" : "val-b2"
      },
      {
        "somekey" : "b",
        "somevalue" : "val-b3",
        "anothervalue" : "val-b4"
      }
    ]
    "c" : [
      {
        "somekey" : "c",
        "somevalue" : "val-c1",
        "anothervalue" : "val-c2"
      }  
    ]
  }
}

在许多情况下,您可能希望展平每个键的数组。在这种情况下,您可以选择保留哪个对象。处理器提供选择第一个或最后一个。例如,考虑以下内容:

...
processor:
  - list_to_map:
      key: "somekey"
      source: "mylist"
      target: "myobject"
      flatten: true
      flattened_element: first
...

然后,新创建的 myobject 中的字段会相应地展平:

{
  "myobject" : {
    "a" : {
      "somekey" : "a",
      "somevalue" : "val-a1",
      "anothervalue" : "val-a2"
    },
    "b" : {
      "somekey" : "b",
      "somevalue" : "val-b1",
      "anothervalue" : "val-b2"
    }
    "c" : {
      "somekey" : "c",
      "somevalue" : "val-c1",
      "anothervalue" : "val-c2"
    }
  }
}

处理传入时间戳

date 处理器通过将传入事件中的 timestamp 键转换为国际标准化组织 (ISO) 8601 格式来解析它:

...
  processor:          
    - date:
        match:
          - key: timestamp
            patterns: ["dd/MMM/yyyy:HH:mm:ss"] 
        destination: "@timestamp"
        source_timezone: "America/Los_Angeles"
        destination_timezone: "America/Chicago"
        locale: "en_US"
...

如果前述管道处理以下事件:

{"timestamp": "10/Feb/2000:13:55:36"}

它会将事件转换为以下格式:

{
  "timestamp":"10/Feb/2000:13:55:36",
  "@timestamp":"2000-02-10T15:55:36.000-06:00"
}

生成时间戳

如果将 destination 选项指定为 @timestampdate 处理器可以为传入事件生成时间戳:

...
  processor:
    - date:
        from_time_received: true
        destination: "@timestamp"
...

推导标点模式

substitute_string 处理器(字符串修改处理器之一)允许您从传入事件中推导标点模式。在以下示例管道中,处理器将扫描传入的 Apache 日志事件并从中推导标点模式:

processor:  
  - substitute_string:
      entries:
        - source: "message"
          from: "[a-zA-Z0-9_]+"
          to:""
        - source: "message"
          from: "[ ]+"
          to: "_"  

以下传入的 Apache HTTP 日志:

[{"message":"10.10.10.11 - admin [19/Feb/2015:15:50:36 -0500] \"GET /big2.pdf HTTP/1.1\" 200 33973115 0.202 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36\""}]

生成以下标点模式:

{"message":"..._-_[//:::_-]_\"_/._/.\"_._\"-\"_\"/._(;_)_/._(,_)_/..._/.\""}

您可以通过使用 count 操作将这些生成的模式传递给 aggregate 处理器来计数它们。

剩余 350 字符

有问题?

想做贡献?