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

索引类型

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

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

语法关键词

LogSearch 查询条件支持如下关键字:
名称 语义
and 双目运算符。形式为 query1 and query2,表示query1query2 查询结果的交集。如果多个单词间没有语法关键词,默认是and 的关系。
or 双目运算符。形式为
query1 or query2
,表示query1query2 查询结果的并集。
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]
说明
  • 语法关键词不区分大小写。
  • 语法关键字的优先级由高到底排序为: > " > ( ) > and not > or
  • Log Service 还保留以下关键字的使用权,如果您需要使用以下关键字,请使用双引号包含起来:sort asc desc group by avg sum min max limit
  • 同时配置全文索引和键值索引时,如果两者的分词字符不一样,那么使用全文查询方式时数据无法查出。
  • 使用数值查询的前提条件是给该列设置类型为double或long,如果您没有设置类型,或者数值范围查询的语法不正确,日志服务会将该查询条件解释成全文索引,可能与您的期望的结果不同。
  • 如果您之前把某列配置为文本类型,现在改成数值类型,那么之前的数据只支持=查询。

查询示例

  1. 同时包含 a 和 b 的日志: a and b 或者 a b
  2. 包含 a 或者包含 b 的日志:a or b
  3. 包含 a 但是不包含 b 的日志:a not b
  4. 所有日志中不包含 a 的日志:not a
  5. 查询包含 a 而且包含 b,但是不包括 c 的日志:a and b not c
  6. 包含 a 或者包含 b,而且一定包含 c 的日志:(a or b ) and c
  7. 包含 a 或者包含 b,但不包括 c 的日志:(a or b ) not c
  8. 包含 a 而且包含 b,可能包含 c 的日志:a and b or c
  9. FILE 字段包含 apsara的日志: FILE:apsara
  10. FILE 字段包含 apsara 和 shennong 的日志:FILE:"apsara shennong" 或者 FILE:apsara FILE: shennong 或者 FILE:apsara and FILE:shennong
  11. 包含 and 的日志:and
  12. FILE 字段包含 apsara 或者 shennong 的日志:FILE:apsara or FILE:shennong
  13. file info 字段包含 apsara 的日志:"file info":apsara
  14. 包括引号的日志:\"
  15. 查询以 shen 开头的所有日志:shen*
  16. 查询 FILE 字段下,以 shen 开头的所有日志:FILE:shen*
  17. 查询以 shen 开头,以 ong 结尾,中间还有一个字符的日志:shen?ong
  18. 查询包括以 shen 开头,并且包括以 aps 开头的日志:shen* and aps*
  19. 查询以 shen 开头的日志的分布,时间片为 20 分钟:shen*| timeslice 20m | count
  20. 查询 topic1 和 topic2 下的所有数据: __topic__:topic1 or __topic__ : topic2
  21. 查询 tagkey1 下 tagvalue2 的所有数据:__tag__ : tagkey1 : tagvalue2
  22. 查询latency大于等于100,并且小于200的所有数据,有两种写法:latency >=100 and latency < 200latency in [100 200)
  23. 查询latency 大于100的所有请求,只有一种写法: latency > 100
  24. 查询不包含爬虫的日志,并且http_referer中不包含opx的日志: not spider not bot not http_referer:opx
  25. 查询cdnIP字段为空的日志: not cdnIP:""
  26. 查询cdnIP字段不存在的日志:not cdnIP:*
  27. 查询存在cdnIP字段的日志:cdnIP:*

指定或跨 Topic 查询

每个 Logstore 根据 Topic 可以划分成一个或多个子空间,当进行查询时,指定 topic 可以限定查询范围,达到更快速度。因此我们推荐对 logstore 有二级分类需求的用户使用 topic 进行划分。

当指定一个或多个 topic 进行查询时,仅从符合条件的 topic 中进行查询。但不输入 topic,默认查询所有 topic 下的数据。

例如,使用Topic来划分不同域名下日志:

图 1. 日志Topic


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