本文介绍日志服务索引所支持的数据类型,包括text、long、double和JSON。
数据类型
目前支持的索引数据类型如下所示。
查询类别 | 索引数据类型 | 说明 | 查询语句示例 |
---|---|---|---|
基础查询 | text | 文本类型,支持关键词查询或模糊匹配。 | uri:"login*" method:"post" |
long | 数值类型,支持区间查询。 | status>200, status in [200, 500] | |
double | 带浮点数的数值类型。 | price>28.95, t in [20.0, 37] | |
组合查询 | JSON | 内容为JSON字段,默认为text类型,支持嵌套模式。可以通过a.b等路径格式给a层中的b元素设置索引,支持的字段类型有text、long、double。 | level0.key>29.95 level0.key2:"action" |
text | 整条日志当做文本进行查询。 | error and "login fail" |
文本类型(text)
查询文本类型(text)日志是基于词(Term)的命中,需要在配置索引时配置分词符、大小写敏感等参数。
全文索引默认会将整条日志(除Time以外所有字段)作为文本类型,不需要指定Key。
示例:开启全文索引,查询如下日志(字段包括time、status、level、message)。
- 日志样例
time:2018-01-02 12:00:00 level:”error” status:200 message:”some thing is error in this field”
- 操作示例
- 查询语句中不需要输入前缀,例如查询error,则level和message两个字段中error都会被命中。
- 设置合适的分词符,例如设置分词符为空时,则status:200作为一个词;分词符设置为冒号(:)时,则拆分为status和200两个词。
- 数值类型会被作为文本处理,例如查询200可以查询到该日志。
说明 时间字段(time)不会被作为文本处理。
- 在搜索框中输入Key(例如status)时整条日志都会被命中。
数值类型(long、double)
数值类型包括long(长整数)类型和double(小数)类型,当字段类型设置为long或double时,对于该字段的查询只能通过数值范围进行查询。
说明
- 如果设置成long类型,而实际值带有小数,则无法查询。
- 如果设置成数值类型(long、double),而实际值是字符串,则无法查询。
- 如果日志中某数值字段不存在,则使用not key:*进行查询。
- 如果是非法的数值类型,则使用not key > -1000000进行查询,表示查询所有有效数值之外的日志,其中-100000替换成您日志中最小的数值。
示例:查询Value范围为(1000 2000]的Key,可以使用以下查询方式。
- 数值类型查询语法
longKey > 1000 and longKey <= 2000
- 数值区间查询语法
longKey in (1000 2000]
JSON类型
JSON是由文本、布尔、数值、数组(Array)和图(Map)构成的组合类型数据。JSON数据作为一种通用类型的数据类型,其自解析、灵活的特性,使其能够很好满足复杂场景下数据的记录需求,在很多日志内容中格式不固定的部分往往都是以JSON的形式进行记录,例如将一次http请求的request参数和response内容以JSON的形式记录在一条日志中。
日志服务支持在索引中将字段类型设置为JSON类型,支持查询分析JSON格式日志。查询JSON类型字段需要加上JSON中父路径的前缀,文本类型、数值类型的查询语法详情请参见查询语法。
说明
- 不支持JSON对象和JSON数组。
- 字段不能在JSON数组中。
- bool类型字段可以转成text类型。
- 查询分析时,JSON类型字段需要用双引号("")括起来。
- 支持JSON格式解析,所有text类型、bool类型的数据自动索引。
json_string.key_map.key_text : test_value json_string.key_map.key_bool : true
- 非JSON数组中的数值类型(double、long)数据,可通过配置指定JSON路径后进行查询。
- 配置索引:key_map.key_long字段类型配置为long。
- 查询语句:json_string.key_map.key_long > 50
- 非JSON数组中的数值类型(double、long)和文本类型(text)数据,可开启统计功能,进行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数据
日志服务会尽可能解析有效内容,直到遇到非法部分结束。
例如以下示例在key_3之后的数据被截断丢失,对于这种缺失的日志,日志服务可正确解析到json_string.key_map.key_2这个字段。
"json_string": { "key_1" : "value_1", "key_map" : { "key_2" : "value_2", "key_3" : "valu
- 日志样例
日志样例中除时间字段外,还包含4个字段,其中message字段是JSON格式。
序号 Key 类型 0 time 不涉及 1 class text 2 status long 3 latency double 4 message json 0. time:2018-01-01 12:00:00 1. class:central-log 2. status:200 3. latency:68.75 4. message: { "methodName": "getProjectInfo", "success": true, "remoteAddress": "1.1.1.1:11111", "usedTime": 48, "param": { "projectName": "ali-log-test-project", "requestId": "d3f0c96a-51b0-4166-a850-f4175dde7323" }, "result": { "message": "successful", "code": "200", "data": { "clusterRegion": "ap-southeast-1", "ProjectName": "ali-log-test-project", "CreateTime": "2017-06-08 20:22:41" }, "success": true } }
- 配置索引
- ①表示可查询json字段中所有文本类型和bool类型的数据。
- ②表示可查询long类型数据。
- ③表示配置的字段可进行SQL分析。
- 查询语句
- 查询文本类型和bool类型的日志
说明
- JSON内字段无需配置。
- JSON图、JSON数组自动展开,支持多层嵌套,每一层以英文句号(.)进行分割。
message.traceInfo.requestId : 92.137_1518139699935_5599 message.param.projectName : ali-log-test-project message.success : true message.result.data.ProjectStatus : Normal
- 查询double类型、long类型的数据
说明 需要对JSON内字段独立配置,字段必须不在数组中。
message.usedTime > 40
- SQL统计分析
说明
- 需要对JSON内字段独立配置,字段必须不在数组中。
- 查询字段需要使用双引号(""),或者设置别名。
* | select avg("message.usedTime") as avg_time , "message.methodName" group by "message.methodName"
- 组合查询
class : cental* and message.usedTime > 40 not message.param.projectName:ali-log-test-project
- 查询文本类型和bool类型的日志