JSON数据作为一种通用类型的数据类型,其自解析、灵活的特性,使其能够很好满足复杂场景下数据的记录需求,在很多日志内容中格式不固定的部分往往都是以json的形式进行记录,如将一次http请求的request参数和response内容以json的形式记录在一条日志中。
为了更好支持json格式日志的查询和分析功能,日志服务加入了对json类型格式的支持。
核心功能 :
-
支持json格式解析,所有text、bool类型自动索引
json_string.key_map.key_text : test_value json_string.key_map.key_bool : true
-
非json array中的double、long类型数据,可通过配置指定json路径后进行查询
配置key_map.key_long这个字段的类型为long 查询 : json_string.key_map.key_long > 50
-
非json array中的text、double、long类型字段,可开启“统计分析”功能,进行sql分析
json_string.key_map.key_long > 10 | select count(*) as c , "json_string.key_map.key_text" group by "json_string.key_map.key_text"
使用限制:
- 不支持json object、json array类型
- 字段不能在json array中
- bool类型字段可以转成text类型
-
支持非完全合法json数据解析
日志服务会尽可能解析有效内容,直到遇到非法部分结束,如"json_string": { "key_1" : "value_1", "key_map" : { "key_2" : "value_2", "key_3" : "valu
在key_3之后的数据被截断丢失,对于这种缺失的日志,日志服务可正确解析到 json_string.key_map.key_2 这个字段
使用参考
对于以下日志样例,其"message"字段是json格式
"message":
{
"traceInfo": {
"traceType": "dubbo_provider",
"stepIndex": "0",
"requestId": "92.137_1518139699935_5599"
},
"methodName": "getProjectInfo",
"success": true,
"remoteAddress": "1.1.1.1:11111",
"param": [
{
"projectName": "ali-log-test-project",
"requestId": "d3f0c96a-51b0-4166-a850-f4175dde7323"
}
],
"localAddress": "2.2.2.2:22222",
"errorCode": null,
"serviceName": "com.aliyun.csc.sls.service.IProjectService",
"usedTime": 48,
"exceptionMsg": null,
"startTime": 1518139699935,
"result": {
"message": "successful",
"code": "200",
"data": {
"clusterRegion": "ap-southeast-1",
"ProjectName": "ali-log-test-project",
"ProjectDesc": "",
"ProjectOwner": "11111111111",
"LastModifyTime": "2017-06-08 20:22:41",
"ProjectStatus": "Normal",
"CreateTime": "2017-06-08 20:22:41"
},
"success": true
}
}
通过以下设置,可以对该json字段进行查询和分析:
string、bool类型数据查询
message.traceInfo.requestId : 92.137_1518139699935_5599
message.param.projectName : ali-log-test-project
message.success : true
message.result.data.ProjectStatus : Normal
注:
json内字段无需配置
json map、array 自动展开,支持多层嵌套,每一层以"."进行分割
long、double类型数据查询
message.usedTime > 40
注:
需要对json内字段独立配置,字段必须不在array
Sql 统计分析
* | select avg("message.usedTime") as avg_time ,
"message.methodName" group by "message.methodName"
注:
需要对json内字段独立配置,字段必须不在array
查询字段需要使用引号 或者设置 别名