日志富化
您可以使用 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_string
和 key_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}
将根据现有条目 date
和 time
的值创建新条目。
例如,以下管道会根据现有事件动态添加新的事件条目:
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
选项指定为 @timestamp
,date
处理器可以为传入事件生成时间戳:
...
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
处理器来计数它们。