日志结构化-JSON

最近更新时间:2024-10-18 10:20:11

我的收藏

场景描述

小王将日志以 JSON 格式采集到日志服务(Cloud Log Service,CLS)。JSON 是多层嵌套,小王想提取 userApp 字段。其中 user 是二级嵌套字段。

原始日志

[
{
"content": {
"App": "App-1",
"start_time": "2021-10-14T02:15:08.221",
"resonsebody": {
"method": "GET",
"user": "Tom"
},
"response_code_details": "3000",
"bytes_sent": 69
}
},
{
"content": {
"App": "App-2",
"start_time": "2222-10-14T02:15:08.221",
"resonsebody": {
"method": "POST",
"user": "Jerry"
},
"response_code_details": "2222",
"bytes_sent": 1
}
}
]

DSL 加工函数

方法一:不展开所有的 KV,使用 jmes 公式直接提取字段。
ext_json_jmes("content", jmes="resonsebody.user", output="user")
ext_json_jmes("content", jmes="App", output="App")
fields_drop("content")
方法二:平铺所有的 KV,丢弃不需要的字段。
ext_json("content")
fields_drop("content")
fields_drop("bytes_sent","method","response_code_details","start_time")

DSL 加工函数详解

方法一:
1. 使用 jmes 公式 resonsebody.user,直接指定二级嵌套的 user 字段。
ext_json_jmes("content", jmes="resonsebody.user", output="user")
2. 使用 jmes 公式 App,直接指定 App 字段。
ext_json_jmes("content", jmes="App", output="App")
方法二:
1. 使用 ext_json 函数从 JSON 数据中提取结构化数据,默认会平铺所有的字段。
ext_json("content")
2. 丢弃 content 字段。
fields_drop("content")
3. 丢弃不需要的字段 bytes_sent,method,response_code_details,start_time
fields_drop("bytes_sent","method","response_code_details","start_time")

加工结果

[{"App":"App-1","user":"Tom"},
{"App":"App-2","user":"Jerry"}]