开发者社区 问答 正文

如何查询日志中的语法?

为了能够帮助您更有效地查询日志,Log Service 提供一套查询语法用以表达查询条件。您可以通过 Log Service API 中的 GetLogsGetHistograms 接口或者在 Log Service 控制台的查询页面指定查询条件。本文档详细说明该查询条件的语法。

索引类型


日志服务支持通过两种模式建立对日志库索引:

  • 全文索引:将整行日志作为整体进行查询,既不区分键与数值(Key,Value)。
  • 键值索引:指定键(Key)情况下进行查询,例如 FILE:app、Type:action。在该键下被包含字符串都会命中。


语法关键词


LogSearch 查询条件支持如下关键字:
名称语义
and双目运算符。形式为 query1 and query2,表示query1 和 query2 查询结果的交集。如果多个单词间没有语法关键词,默认是 and 的关系。
or双目运算符。形式为 query1 or query2,表示query1 和 query2 查询结果的并集。
not双目运算符。形式为 query1 not query2,表示符合query1 并且不符合 query2 的结果,相当于query1–query2。如果只有 not query1,那么表示从全部日志中选取不包含 query1 的结果。
( , )左右括号用于把一个或多个子 query 合并成一个 query,用于提高括号内 query 的优先级。
:用于 key-value 对的查询。term1:term2 构成一个 key-value 对。如果 key 或者 value 内有空格,需要用引号把整个 key 或者 value 包括起来。
把一个关键词转换成普通的查询字符。左右引号内部的任何一个 term 都会被查询,而不会当成语法关键词。或者在 key-value 查询中把左右引号内的所有 term 当成一个整体。
\转义符。用于转义引号,转义后的引号表示符号本身,不会当成转义字符,例如 "\""。
|管道运算符,表示前一个计算的基础上进行更多计算,例如 query1 | timeslice 1h | count。
timeslice时间分片运算符,表示多长时间的数据作为一个整体进行计算,使用方式有 timeslice 1h,timeslice 1m,timeslice 1s 分别表示以 1 小时,1 分钟,1s 作为一个整体。例如 query1 | timeslice 1h | count 表示查询 query 这个条件,并且返回以 1 小时为时间分片的总次数。
count计数运算符,表示日志条数。
*模糊查询关键字,用于替代 0 个或多个字符,例如:que*,会返回 que 开头的所有命中词。注意:该查询最多返回100个符合关键词下结果
?模糊查询关键字,用于替代一个字符,比如 qu?ry,会返回以 qu 开头,以 ry 结尾,并且中间还有一个字符的所有命中词。
__topic__查询某个 topic 下数据,新的语法下,可以在 query 中查询 0 个或多个 topic 的数据,例如__topic__:mytopicname。
__tag__查询某个 tag key 下某个 tag value,例如__tag__:tagkey:tagvalue。
source查询某个 IP 的数据,例如 source:127.0.0.1。
>查询某个字段下大于某个数值的日志,例如latency > 100。
>=查询某个字段下大于或等于某个数值的日志,例如latency >= 100。
<查询某个字段下小于某个数值的日志,例如latency < 100。
<=查询某个字段下小于或等于某个数值的日志,例如latency <= 100。
=查询某个字段下等于某个数值的日志,例如latency = 100。
in查询某个字段处于某个范围内的日志,使用中括号表示闭区间,使用小括号表示开区间,括号中间使用两个数字,数字中间为若干个空格。例如latency in [100 200]或 latency in (100 200]。

[backcolor=transparent]注意:
  • 语法关键词不区分大小写。
  • 语法关键字的优先级由高到底排序为 : > " > ( ) > and not > or。
  • Log Service 还保留以下关键字的使用权,如果您需要使用以下关键字,请使用引号包含起来: sort asc desc group by avg sum min max limit。
  • 同时配置全文索引和键值索引时,如果两者的分词字符不一样,那么使用全文查询方式时数据无法查出。
  • 使用数值查询的前提条件是给该列设置类型为double或long,如果您没有设置类型,或者数值范围查询的语法不正确,日志服务会将该查询条件解释成全文索引,可能与您的期望的结果不同。
  • 如果您之前把某列配置为文本类型,现在改成数值类型,那么之前的数据只支持=查询。


查询示例

  • 同时包含 a 和 b 的日志: a and b 或者 a b。
  • 包含 a 或者包含 b 的日志:a or b。
  • 包含 a 但是不包含 b 的日志:a not b。
  • 所有日志中不包含 a 的日志:not a。
  • 查询包含 a 而且包含 b,但是不包括 c 的日志:a and b not c。
  • 包含 a 或者包含 b,而且一定包含 c 的日志:(a or b ) and c。
  • 包含 a 或者包含 b,但不包括 c 的日志:(a or b ) not c。
  • 包含 a 而且包含 b,可能包含 c 的日志:a and b or c。
  • FILE 字段包含 apsara的日志: FILE:apsara。
  • FILE 字段包含 apsara 和 shennong 的日志:FILE:"apsara shennong" 或者 FILE:apsara FILE: shennong或者 FILE:apsara and FILE:shennong。
  • 包含 and 的日志:and。
  • FILE 字段包含 apsara 或者 shennong 的日志: FILE:apsara or FILE:shennong。
  • file info 字段包含 apsara 的日志:"file info":apsara。
  • 包括引号的日志:\"。
  • 查询以 shen 开头的所有日志:shen*。
  • 查询 FILE 字段下,以 shen 开头的所有日志:FILE:shen*。
  • 查询以 shen 开头,以 ong 结尾,中间还有一个字符的日志:shen?ong。
  • 查询包括以 shen 开头,并且包括以 aps 开头的日志:shen* and aps*。
  • 查询以 shen 开头的日志的分布,时间片为 20 分钟: shen*| timeslice 20m | count。
  • 查询 topic1 和 topic2 下的所有数据: __topic__:topic1 or __topic__ : topic2。
  • 查询 tagkey1 下 tagvalue2 的所有数据:__tag__ : tagkey1 : tagvalue2。
  • 查询latency大于等于100,并且小于200的所有数据,有两种写法: latency >=100 and latency < 200或latency in [100 200)。
  • 查询latency 大于100的所有请求,只有一种写法: latency > 100。


其他语法



指定或跨 Topic 查询


每个Logstore根据Topic可以划分成一个或多个子空间,当进行查询时,指定Topic可以限定查询范围,达到更快速度。因此我们推荐对Logstore有二级分类需求的用户使用Topic进行划分。
当指定一个或多个Topic进行查询时,仅从符合条件的Topic中进行查询。但不输入Topic,默认查询所有Topic下的数据。
例如,使用Topic来划分不同域名下日志:

Topic 查询语法:
  • 支持查询所有Topic下的数据,在查询语法和参数中都不指定Topic表示查询所有Topic的数据。
  • 支持在Query中查询Topic,查询语法为 __topic__:topicName。同时仍然支持旧的模式,即在URL参数中指定Topic。
  • 支持查询多个Topic,例如 __topic__:topic1 or __topic__:topic2 表示查询Topic1和Topic2下的数据的并集。


Histogram 查询


日志服务新增语法提供了自定义区间的功能。查询语法为:


通过变更Timeslice的参数,可以灵活的调整区间大小。例如,查询 2 个小时数据,不同的Timeslice参数对应的结果为:
Timeslice 参数Histogram 区间数每个区间大小
1h21 小时
30m430 分钟
2m602 分钟
[tr=rgb(239, 251, 255)][td]30s 24030 秒

展开
收起
轩墨 2017-10-23 11:08:49 2882 分享 版权
0 条回答
写回答
取消 提交回答