日志服务查询功能可以针对各种数据类型提供查询,如文本、数值、模糊、JSON。
查询功能需要开启查询分析功能,开启步骤请参考简介。
和搜索引擎类似,文本类(Text)数据查询基于词(Term)的命中,因此需要配置分词符,大小写敏感,包含中文(中文分词)等选项。
原始日志查询时是否需要支持大小写,例如原始日志为“internalError”:
原始日志内容根据分词符可以将日志内容切分成多个关键词。
例如我们要查询如下日志内容:
/url/pic/abc.gif
/url/pic/abc.gif
,只有通过该完整字符串,或通过模糊查询/url/pic/*
才能找到。/
,则原始日志被切分为url
、pic
和abc.gif
三个单词,可以使用任意一个单词或单词模糊查询都可以找到该日志,例如url
、abc.gif
或pi*
,也可以使用/url/pic/abc.gif
进行查询(查询时会被拆分为url and pic and abc.gif
三个条件)。/.
,则原始日志被切分为url pic abc gif
四个单词。注意:通过设置合理的分词符,可以放宽查询的范围。
如果日志中包含中文,需要打开中文分词。例如对如下日志内容:
buyer:用户小李飞刀lee
默认分词符为”:”,则原始日志会被拆分为buyer
、用户小李飞刀lee
这两个单词,如果搜索用户
,则不会返回lee
,如果开启包含中文选项后,日志服务后台分词器会智能去理解中文含义,并将日志拆分为buyer
、用户
、小李
、飞刀
和lee
五个单词,无论使用飞刀
或小李飞刀
(会被解析为:小李 and 飞刀
) 都可以查找到日志。
注意:中文分词对写入速度会有一定影响,请根据需求谨慎设置。
支持类型:long
(整数)或者double
(小数),当设置为数值类型后对于该键的查询只能通过数值范围。例如,您可以通过以下关键字查询键值范围为1000~2000的longkey。
longKey > 1000 and longKey < 2000
Json是由文本、布尔、数值、数组(Array)和图(Map)构成的组合类型数据。
对JSON类型字段,会自动识别text/bool类型字段。
例如对以下jsonkey:
jsonkey: {
key1:text_value,
key2:true,
key3:3.14
}
可以通过jsonkey.key1:"text_value" ,jsonkey.key2:true
等条件进行查询。
非json array中的double、long类型数据,可通过设置类型,并指定路径后进行查询。
jsonkey.key3这个字段的类型为double
查询 : jsonkey.key3 > 3
会尽可能解析有效内容,直到遇到非法部分结束。
例如:
"json_string":
{
"key_1" : "value_1",
"key_map" :
{
"key_2" : "value_2",
"key_3" : "valu
在key_3之后的数据被截断丢失,对于这种缺失的日志可正确解析到json_string.key_map.key_2
这个字段。
全文查询(索引)默认会将整条日志作为文本类型,全文查询默认不需要指定key。例如对以下由4个字段组成的日志(时间/status/level/message)。
[20180102 12:00:00] status:200,level:"error",message:"some thing is error in this field"
当打开全文索引时,整条日志所有的key,value都会被拆分成一个个独立单词。
[20180102 12:00:00] status 200 level error message some thing is error in this field
在检索过程中搜索error时(level和message两个字段中error都会被命中)。
以下一条日志除时间外,还包含4个键值:
序号 | Key | 类型 |
---|---|---|
0 | time | |
1 | class | text |
2 | status | long |
3 | latency | double |
4 | message | json |
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
}
}
设置如下:
其中:
class : cental*
message.traceInfo.requestId : 92.137_1518139699935_5599
message.param.projectName : ali-log-test-project
message.success : true
注意:
latency>40
message.usedTime > 40
注意:需要对json内字段独立配置,字段必须不在array。
class : cental* and message.usedTime > 40 not message.param.projectName:ali-log-test-project
查询语法请参见 日志查询语法 ,对查询结果进行分析参见分析语法。
如果您查询需要检索的日志数据量很大时(如查询时间跨度非常长,其中数据量在百亿以上等),则一次查询请求无法检索完所有数据。在这种情况下,日志服务会把已有的数据返回给您,并在返回结果中告知您该查询结果并不完整。如此同时,服务端会缓存 15 分钟内的查询结果。当查询请求的结果有部分被缓存命中,则服务端会在这次请求中继续扫描未被缓存命中的日志数据。为了减少您合并多次查询结果的工作量,日志服务会把缓存命中的查询结果与本次查询新命中的结果合并返回给您。因此日志服务可以让您通过以相同参数反复调用该接口来获取最终完整结果。
在文档使用中是否遇到以下问题
更多建议
匿名提交