使用 Amazon OpenSearch Ingestion 实现日志扩充 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 Amazon OpenSearch Ingestion 实现日志扩充

您可以使用 Amazon OpenSearch Ingestion 执行不同类型的日志扩充。除以上示例之外,您也可以使用通用日志管道蓝图。有关蓝图的更多信息,请参阅 使用蓝图创建管道

过滤

使用删除事件处理器筛选出特定的日志事件,然后再将它们发送到接收器。例如,假设您正在收集 Web 请求日志,且仅希望存储不成功的请求。您可以创建以下管道,删除所有响应小于 400 的请求,仅剩余 HTTP 状态代码为 400 及以上的日志事件。

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

drop_when 选项指定要从管道中删除的偶数。

从字符串中提取密钥值对

日志数据通常包含密钥值对字符串。HTTP 查询字符串是一种常见场景。例如,如果 Web 用户查询可分页 URL,则 HTTP 日志可能包含以下 HTTP 查询字符串:

page=3&q=my-search-term

要使用搜索词执行分析,您可以从查询字符串中提取 q 值。密钥值处理器为从字符串中提取密钥和值提供稳健支持。

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

version: "2" 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" value_key: "value" flatten: true ...

处理器可通过移除 mylist 并添加新的 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 ...

然后,相应展平传入事件结构:

{ "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" } } }

您可以使用 List-to-map 处理器处理 Amazon WAF 日志。例如,考虑类似下面的示例 WAF 日志:

{ "webaclId": "arn:aws:wafv2:ap-southeast-2:111122223333:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "httpRequest": { "headers": [ { "name": "Host", "value": "localhost:1989" }, { "name": "User-Agent", "value": "curl/7.61.1" } ] } }

如果以下管道处理事件:

... processor: - list_to_map: key: "name" source: "httpRequest/headers" value_key: "value" flatten: true ...

将创建以下新事件:

{ "webaclId": "arn:aws:wafv2:ap-southeast-2:111122223333:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "httpRequest": { "headers": [ { "name": "Host", "value": "localhost:1989" }, { "name": "User-Agent", "value": "curl/7.61.1" } ] }, "Host": "localhost:1989", "User-Agent": "curl/7.61.1" }

处理传入时间戳

日期处理器将传入事件的时间戳密钥转换为 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 选项指定 @timestamp,则日期处理器可以为传入事件生成时间戳。

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

派生标点模式

替换字符串处理器(转换字符串处理器之一)允许您从传入事件派生标点模式。在以下示例管道中,处理器将扫描传入 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 操作的聚合处理器传递生成的这些模式,从而进行计数。