云日志服务提供一套查询分析语句,由查询条件与SQL语句组成,两者通过管道符竖线 | 分割。
- 查询条件:通过查询条件指定日志内容需要匹配的条件,返回符合该条件的日志。例如使用 'status:404' 查询响应状态码为404的日志。检索条件为空代表无检索条件,即所有日志均可被查询出来。
- SQL语句:通过SQL语句可针对符合检索条件的日志进行统计分析,返回统计分析结果。例如使用以下查询分析语句,统计响应状态码为404的日志数量。
status:404 | select count(*) as num
本文主要介绍查询语句语法,SQL语法与使用说明请查看SQL语法。若您只需要查询日志,不需要进行统计分析,则可省略其中的管道符及SQL语句。
查询方式
根据索引配置方式可分为全文搜索和字段搜索,根据搜索精确程度可分为精确搜索和模糊搜索。
以下为云日志服务提供的各种查询方式介绍以及查询语句示例。
全文查询
-
前提条件:配置索引时开启了全文索引,详情请查看索引配置。
-
语法说明:日志单元配置全文索引后,日志服务将原始日志拆分成多个关键词。您可直接输入关键词进行检索。
keyword1 [ [ and | or | not ] keyword2 ] ...
-
使用示例:以下示例均为搜索原文中同时包含ERROR和INFO关键词的日志
ERROR INFO
ERROR and INFO
注意
__message__为日志原文对应的内置字段,查询语句ERROR等同于__message__:ERROR,默认匹配日志原文的内容。
多个关键词默认通过AND连接,查询语句ERROR INFO等同于ERROR and INFO。
字段查询
-
前提条件:配置索引时开启了字段索引,详情请查看索引配置。
-
语法说明:日志单元配置字段索引后,您可以指定字段名和字段值(key = value)进行搜索。根据字段索引中设置的数据类型,您可以进行多种类型的基础搜索和组合搜索。
keyname1 [ : | > | >= | < | <= | = | in ] value1 [ [ and | or | not ] keyname2 ... ]
-
使用示例:
- 检索字段 level 为ERROR的日志:
level: ERROR
- 检索字段 latency(索引类型为double)大于100的日志:
latency > 100
- 检索字段 host为 test且 latency大于100的日志:
host: test and latency > 100
注意
value参数不可为空,您可通过查询语句key:""匹配字段值为空的日志。
字段查询和 not 运算符配合使用时,还会匹配到不包含该字段的日志。
精确查询
-
前提条件:配置索引时开启了字段索引或全文索引,详情请查看索引配置。
-
使用说明:使用精确的词进行搜索。
-
使用示例
- 搜索字段 level为ERROR的日志:
level: ERROR
- 搜索原文中同时包含ERROR和INFO关键词的日志
ERROR and INFO
- 搜索字段 level为ERROR的日志:
模糊查询
-
前提条件:配置索引时开启了字段索引或全文索引,详情请查看索引配置。
-
使用说明:在搜索查询语句中指定一个词,在词的中间或者末尾加上模糊搜索关键字,星号(*)或问号(?),云日志服务会在所有日志中搜索到符合条件的词,返回包含这些词并满足搜索条件的所有日志。
-
使用示例:
- 在所有日志中查找以GE开头的词,并返回包含这些词的日志
GE*
- 在所有日志中查找request_method字段值以GE开头的词,并返回包含这些词的日志
request_method:GE*
- 在所有日志中查找以GE开头的词,并返回包含这些词的日志
注意
星号(*)代表匹配多个字符,问号(?)代表匹配1个字符。
星号(*)或问号(?)不能用在词的开头。
double数据类型不支持使用星号(*)或问号(?)进行模糊搜索。
运算符
查询语句支持以下运算符:
运算符 | 说明 | 示例 |
---|---|---|
: | 用于字段检索(key:value); 如果字段值value内有空格、冒号(:)、连字符(-)等特殊字符,请使用引号(""或'')包裹字段值。 |
status: 404; msg: "no such file" |
and | 与运算符,不区分大小写。如果多个关键词之间没有语法关键词,则默认为and关系。 | abc:123 and bcd:456 |
or | 或运算符,不区分大小写。 | abc:123 or abc:456 |
not | 非运算符,区分大小写。not 作为运算符使用时需要使用空格分隔。not 运算符和字段搜索配合使用时还会匹配到不包含对应字段的日志。 | not abc:123 |
"" | 可使用双引号("")将该语法关键词转换成普通字符。如msg:"or"表示检索包含or的日志,此处的or不代表运算符。 | msg:"or" |
( ) | 逻辑分组操作符,控制逻辑运算优先级。 | (abc = 123 or abc = 456) and status = 200 |
\ | 转义符号,转义后的字符表示符号本身,被检索的值包含双引号("")、冒号(:)时,需进行转义。 | 如日志内容为 name:lb"0x1F",可输入关键词 name\:lb\"0x1F\" |
> | 范围操作符,表示大于某个数值,仅适用于double类型的字段。 | abc > 123 |
>= | 范围操作符,表示大于等于某个数值,仅适用于double类型的字段。 | abc >= 123 |
< | 范围操作符,表示小于某个数值,仅适用于double类型的字段。 | abc < 123 |
<= | 范围操作符,表示小于等于某个数值,仅适用于double类型的字段。 | abc <= 123 |
= | 范围操作符,表示等于某个数值,仅适用于double类型的字段。针对double类型的字段,等号(=)和冒号(:)作用相同。 | abc = 123 |
in | 检索某字段值处于某数值范围内的日志,中括号表示闭区间,圆括号表示开区间,两个数字之间使用空格分隔。仅适用于double类型的字段。 | latency in (5 100] |
查询语句示例
以下为常用查询语句示例
普通查询示例
查询需求 | 语句 |
---|---|
搜索POST请求且状态码为200的日志。 | request_method:POST and status = 200 |
搜索GET请求或POST请求成功(状态码为200~299)的日志。 | (request_method:POST or request_method:GET) and status in [200 299] |
搜索GET请求或POST请求失败(状态码不为200~299)的日志。 | (request_method:POST or request_method:GET) and not status in [200 299] |
搜索非GET请求的日志。 | not request_method:GET |
搜索GET请求成功且请求时间小于60秒的日志。 | request_method:GET and request_time < 60 |
搜索请求时间为60秒的日志。 | request_time = 60 |
搜索请求时间大于等于60秒,并且小于300秒的日志。 | request_time >= 60 and request_time < 300 或 request_time in [60 300) |
搜索全文包含and的日志。 | "and" |
搜索user字段值为空的日志。 | user:"" |
进阶模糊查询示例
查询需求 | 查询语句 |
---|---|
搜索包含以POS开头的词的日志。 | POS* |
搜索包含以POS开头,结尾只有一个字符的词的日志。 | POS? |
搜索request_method字段值以POS开头的日志。 | request_method:POS* |
搜索request_method字段值以P开头,以T结尾,中间还有单个字符的词的日志。 | request_method:P?T |
搜索request_method字段值包含以P开头,以T结尾,中间包含零个、单个或多个字符的词的日志。 | request_method:P*T |