搜索语法
云日志服务LTS提供一套搜索语法用于设置搜索条件,帮助您更有效地搜索日志。
搜索方式
搜索语句用来指定日志搜索时的过滤规则,返回符合条件的日志。
根据索引配置方式可分为全文搜索和字段搜索,根据搜索精确程度可分为精确搜索和模糊搜索。其他类型的搜索方式包括范围搜索、短语搜索等。
搜索方式 |
说明 |
示例 |
---|---|---|
全文搜索 |
配置全文索引后,日志服务根据您设置的分词符将整条日志拆分成多个关键词。
说明:
|
上述三个搜索语句功能相同,均表示搜索同时包含关键词GET和POST的日志。 |
字段搜索 |
配置字段索引后,您可以指定字段名称和字段值(key:value)进行搜索。根据字段索引中设置的数据类型,您可以进行多种类型的基础搜索和组合搜索。
说明:
|
|
精确搜索 |
使用精确的词进行搜索。 日志服务搜索采用的是分词法,搜索时不会保证关键词出现的顺序。
说明:
搜索语句为abc def,会匹配所有同时包含abc和def的日志,日志abc def或者def abc都会命中,如果需要确保关键词出现的顺序,请您采用#"abc def"。 |
|
模糊搜索 |
在搜索语句中指定一个词,在词的中间或者末尾加上模糊搜索关键字,即星号(*)或问号(?),日志服务会在所有日志中搜索到符合条件的词,返回包含这些词并满足搜索条件的所有日志。
说明:
|
|
范围搜索 |
long数据类型和float数据类型支持范围搜索。
|
|
短语搜索 |
短语搜索用于完全匹配日志中的目标短语,可以确保关键词出现的顺序。
说明:
短语搜索不支持模糊搜索。 |
#"abc def"表示在所有日志中查找包含目标短语abc def 的日志。 |
- 分词符
云日志服务LTS会根据分词符,将日志内容拆分成多个词。日志服务默认配置的分词符为 , '";=()[]{}@&<>/:\n\t\r。
例如日志2023-01-01 09:30:00,默认分词符会将其分为四部分:2023-01-01、09、30、00。
此时搜索语句2023无法匹配到该条日志,可以通过2023-01*或2023-01-01搜索到该条日志。
如果设置分词符为空,则字段值将被当成一个整体,您只能通过完整日志内容或模糊搜索查找对应的日志。
- 关键词顺序
只有短语搜索#"abc def"才能保证关键词出现的顺序,其他搜索方式多个关键词默认AND连接。
例如request_method:GET POST查询的是同时包含GET和POST的日志,不会保证GET和POST的顺序。
- 语法关键词
日志搜索语句的语法关键词包括:&& || AND OR and or NOT not in : > < = ( ) [ ] 中文冒号 中文双引号
其中 and AND or OR NOT not in 作为语法关键词使用时,前后需要使用空格分隔;
如果日志中本身包含语法关键词且需要搜索时,搜索语句需要用双引号包裹,否则可能会导致语法错误或搜索到错误的结果。
例如搜索语句content:and, 包含语法关键词 and ,需要修改为content:"and"。
运算符
搜索语句支持如下运算符。
- 除in运算符外,其他运算符不区分大小写。
- 运算符的优先级由高到低排序如下所示:
- 冒号(:)
- 双引号("")
- 圆括号( )
- and、not
- or
运算符 |
说明 |
---|---|
and |
与运算符,如果多个关键词之间没有语法关键词,默认为and关系,例如GET 200等同于GET and 200。
说明:
and作为运算符使用时前后需要使用空格分隔。例如 1 and 2 代表搜索同时包含1 和2的日志;1and2代表搜索包含词语1and2的日志。 |
AND |
与运算符,等同于and。 |
&& |
与运算符。
说明:
&&作为运算符使用时不需要使用空格分隔。例如 1 && 2 等同于1&&2,代表搜索同时包含1 和2的日志。 |
or |
or运算符,例如request_method:GET or status:200。
说明:
or 作为运算符使用时前后需要使用空格分隔。 |
OR |
或运算符,等同于or。 |
|| |
或运算符。|| 作为运算符使用时不需要使用空格分隔。 |
not |
非运算符。例如request_method:GET not status:200、not status:200。
说明:
|
( ) |
用于提高括号内搜索条件的优先级。例如(request_method:GET or request_method:POST) and status:200。 |
: |
用于字段搜索(key:value),例如request_method:GET。
说明:
如果字段名称或者字段值内有空格、冒号(:)等保留字符,请使用双引号("")包裹字段名称或者字段值。例如"request method":GET、message:"This is a log"。 |
"" |
使用双引号("")包裹一个语法关键词,可以将该语法关键词转换成普通字符,例如"and"表示搜索包含and的日志,此处的and不代表运算符。 |
\ |
转义符号,用于转义双引号(""),转义后的引号表示符号本身。例如日志内容为instance_id:nginx"01",您可以使用instance_id:nginx\"01\"进行查询。 |
* |
通配符搜索,匹配零个、单个、多个字符。例如request_method:P*T。
说明:
不支持放在关键词开头,推荐放在关键词的中间部分或者结尾。 |
? |
通配符搜索,匹配单个字符。例如request_method:P?T,可以匹配到PUT,无法匹配到POST。
说明:
不支持放在关键词开头,推荐放在关键词的中间部分或者结尾。 |
> |
搜索某字段值大于某数值的日志。例如request_time>100。 |
>= |
搜索某字段值大于或等于某数值的日志。例如request_time>=100。 |
< |
搜索某字段值小于某数值的日志。例如request_time<100。 |
<= |
搜索某字段值小于或等于某数值的日志。例如request_time<=100。 |
= |
搜索某字段值等于某数值的日志,仅适用于float、long类型的字段。对于该类型的字段,等号(=)和冒号(:)作用相同。例如request_time=100等同于request_time:100。 |
in |
搜索某字段值处于某数值范围内的日志,中括号表示闭区间,小括号表示开区间,两个数字之间使用空格分隔。例如request_time in [100 200]或request_time in (100 200]。
说明:
in只能为小写字母,且作为运算符使用时前后需要使用空格分隔。 |
#"" |
用于搜索包含目标短语的日志,可以保证关键词出现的顺序。
说明:
短语搜索中的星号(*)和问号(?)会被视为普通字符,因此短语搜索不支持模糊搜索,可以用来搜索日志中的星号(*)和问号(?)。 |
搜索语句示例
同一条搜索语句,针对不同的日志内容和索引配置时,会有不同的搜索结果。本文基于如下日志样例和索引介绍搜索语句示例。
搜索需求 |
搜索语句 |
---|---|
搜索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请求失败的日志。 |
(request_method:POST or request_method:GET) not status in [200 299] |
搜索非GET请求的日志。 |
not request_method:GET |
搜索GET请求成功且请求时间小于60秒的日志。 |
request_method:GET and status in [200 299] not request_time>=60 |
搜索请求时间为60秒的日志。 |
|
搜索请求时间大于等于60秒,并且小于200秒的日志。 |
|
搜索包含and的日志。 |
content:"and"
说明:
此处使用双引号将and包裹,and为普通字符串,不代表运算符。 |
搜索不存在user字段的日志。 |
not user:* |
搜索星期字段值不为星期一的日志。 |
not week:星期一 |
搜索sec-ch-ua-mobile字段值为?0的日志。 |
sec-ch-ua-mobile:#"?0"
说明:
日志内容中包含*或?且需要搜索时,需要采用短语查询。 |
下面介绍进阶搜索示例。
搜索需求 |
搜索语句 |
---|---|
搜索包含以GE开头的词的日志。 |
GE* |
搜索包含以GE开头,结尾只有一个字符的词的日志。 |
GE? |
搜索request_method字段值包含以G开头的词的日志。 |
request_method:G* |
搜索request_method字段值包含以P开头,以T结尾,中间还有单个字符的词的日志。 |
request_method:P?T |
搜索request_method字段值包含以P开头,以T结尾,中间包含零个、单个或多个字符的词的日志。 |
request_method:P*T |
基于分词符的搜索,例如User-Agent字段值为Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36。
- 设置分词符为空时,该字段值将被当成一个整体,则您使用User-Agent:Chrome搜索语句进行搜索时,无法搜索到日志。
- 设置分词符为, '";=()[]{}?@&<>/:\n\t\r后,该字段值会被拆分为Mozilla、5.0、Windows、NT、10.0、Win64、x64、AppleWebKit、537.36、KHTML、like、Gecko、Chrome、113.0.0.0、Safari、537.36。
此时可以使用User-Agent:Chrome等搜索语句进行搜索。
表5 基于分词符的搜索 搜索需求
搜索语句
搜索User-Agent字段值中包含Chrome的日志。
User-Agent:Chrome
搜索User-Agent字段值中包含以Win开头的词的日志。
User-Agent:Win*
搜索User-Agent字段值中包含Chrome和Linux的日志。
User-Agent:"Chrome Linux"
搜索User-Agent字段值中包含Firefox或Chrome的日志。
User-Agent:Chrome OR User-Agent:Linux
搜索User-Agent字段值包含Chrome,但不包含Linux的日志。
User-Agent:Chrome NOT User-Agent:Linux