前提条件
对日志进行查询,必须先创建索引。
基础语法
查询语句与分析语句以|分割,格式为查询语句|分析语句,示例如下:
* | SELECT status, count(*) AS PV GROUP BY status
语句类型 | 说明 |
查询语句 | 查询条件,可以为关键词、数值、数值范围、空格、星号(*)等。 如果为空格或星号(*),表示无过滤条件。 |
分析语句 |
重要 必须与查询语句一起使用,分析语句中无需填写FROM子句和WHERE子句,默认分析当前Logstore中的数据。分析语句不支持offset,不区分大小写,末尾无需加分号。 对查询结果或全量数据进行计算和统计。日志服务支持的分析函数和语法: |
查询语句编写思路

查询语句的编写流程可分为以下三步:
步骤一:确定查询方式
重要 不同的索引配置,会产生不同的查询和分析结果,如果同时创建了全文索引和字段索引,以字段索引的配置为准。
根据索引类型的不同,日志服务Logstore查询可分为全文查询和字段查询。全文查询和字段查询区别如下:
如果只创建全文索引,则只能使用全文查询。
如果已创建字段索引,则按以下规则查询:
全文查询
不针对具体的字段进行查询,支持通配符(*、?)和逻辑运算符(如and、or等)。
查询语法
keywords1 [ and | or | not ] keywords2 ...
示例
示例1
查询关键词为GET相关的日志。则查询语法:GET。
示例2
查询关键词为GET或POST相关的日志。则查询语法:GET or POST 。
示例3
查询以Jo开头相关的日志,例如Joe、Jon等。则查询语法为:Jo?。
字段查询
针对具体字段名,支持类型化运算(如数值比较、正则表达式),需字段已建立索引。
查询语法
indexname1 [ : | > | >= | < | <= | = | in ] keyword1 [ [ and | or | not ] indexname2 ... ]
示例
示例1
查询 request_method为 GET 相关的日志,则查询语法为:request_method: GET。
示例2
查询 request_time_msec 大于 50 相关的日志,则查询语法为request_time_msec>50(该字段索引类型为double)。
示例3
查询 request_method 为 GET 且request_time_msec 大于50 相关的日志。则查询语法为:request_method: GET and request_time_msec>50。
步骤二:确定字段类型
编写查询语句时需要考虑字段类型的特点,合理使用运算符,快速、精准地锁定目标日志。
字段类型
字段类型 | 说明 | 可用运算符 |
text类型 | 字符串类型的字段。开启全文索引后,日志服务默认将整条日志(除__time__以外所有字段)设置为text类型。 | and、or、not、()、:、""、\、*、?。
|
long和double类型 | 只有设置字段的数据类型为long或double后,才能通过数值范围查询该字段的值。 如果字段的数据类型不被设置为double、long或者查询时数值范围的语法错误,那么日志服务会按照全文查询方式进行查询,这样查询到的结果可能与期望的结果不同。 例如字段owner_id不是double、long类型,则执行查询语句owner_id>100时,会返回同时包含owner_id、>(非分词符)、100这三个词的日志。 如果将字段的类型从text类型改成double、long类型,则只支持等号=查询。如果需要使用范围查询、大于号(>)、小于号(<)等运算符,必须重建索引。
| and、or、not、()、>、>=、<、<=、=、in。
|
JSON类型 | 针对JSON对象中的字段,可根据其值,将数据类型设置为long、double或text,并开启统计功能。 | 根据JSON对象中的字段的类型使用不同的运算符。 |
运算符
运算符 | 说明 |
:
| 用于字段查询(Key:Value),例如request_method:GET。 如果字段名称或者字段值内有空格、冒号(:)、连字符(-)等特殊字符,请使用双引号("")包裹字段名称或者字段值,例如"file info":apsara。 |
and
| and运算符。例如request_method:GET and status:200。
如果多个关键词之间没有语法关键词,默认为and关系,例如GET 200 cn-shanghai等同于GET and 200 and cn-shanghai。 |
or
| or运算符。例如request_method:GET or status:200。
|
not
| not运算符。例如request_method:GET not status:200、not status:200。
|
( )
| 用于提高括号内查询条件的优先级。例如(request_method:GET or request_method:POST) and status:200。 |
""
| 使用""(双引号)包裹一个语法关键词,可以将该语法关键词转换成普通字符。在字段查询中""内的所有词被当成一个整体。 当字段名或字段值中存在特殊字符(空格、中文、:、-等)、语法关键词(and、or等)等内容时,需要使用""包裹。例如"and"表示查询包含and的日志,此处的and不代表运算符。 日志服务保留以下运算符的使用权,如果需要使用以下运算符作为查询关键字,请使用""包裹:sort、asc、desc、group by、avg、sum、min、max和limit。 通过数据加工或者Logtail插件处理的日志,其tag中的key会被转换成普通key,即查询时需使用""包裹字段名,例如"__tag__:__client_ip__":192.0.2.1,此处的__tag__:__client_ip__为日志服务保留字段,表示日志所在主机的IP地址。更多信息,请参见保留字段。
|
\
| 转义符号,用于转义""(双引号),转义后的双引号表示符号本身。例如日志内容为instance_id:nginx"01",您可以使用instance_id:nginx\"01\"进行查询。 |
*
| 通配符查询,匹配零个、单个、多个字符。例如host:www*com。
说明 日志服务会在所有日志中为您查询到符合条件的100个词,返回包含这100个词并满足查询条件的所有日志。 |
?
| 通配符查询,匹配单个字符。例如host:aliyund?c。 |
>
| 查询某字段值大于某数值的日志。例如request_time>100。 |
>=
| 查询某字段值大于或等于某数值的日志。例如request_time>=100。 |
<
| 查询某字段值小于某数值的日志。例如request_time<100。 |
<=
| 查询某字段值小于或等于某数值的日志。例如request_time<=100。 |
=
| 查询某字段值等于某数值的日志。针对double、long类型的字段,=和:作用相同。例如request_time=100等同于request_time:100。 |
in
| 查询某字段值处于某数值范围内的日志,中括号表示闭区间,小括号表示开区间,两个数字之间使用空格分隔。例如request_time in [100 200]或request_time in (100 200]。 |
__source__
| 查询某个日志源的日志,支持通配符。例如__source__:192.0.2.*。
重要 日志服务中的__source__为保留字段,可缩写为source。如果您自定义的字段中存在source字段,则会与日志服务保留字段source冲突,此时您需要使用Source、SOURCE等词查询自定义的字段。 |
__tag__
| 通过元数据信息查询日志。例如__tag__:__receive_time__:1609837139。 |
__topic__
| 查询某日志主题下的日志。例如__topic__:nginx_access_log。 |
步骤三:确定匹配模式
根据掌握的关键词信息及实际业务场景的需要灵活控制使用精准查询还是模糊查询。
查询方式 | 说明 | 示例 |
精确查询 | 使用完整的词进行查询。 日志服务查询采用的是分词法,精确查询时并不能完全匹配关键词。例如查询语句为abc def,查询结果将包含所有abc和def的日志,无法完全匹配目标短语。如果您要完全匹配短语abc def,可以使用短语查询或者Like语法。更多信息,请参见短语查询、如何精准查询日志。 | host:example.com表示查询host字段值包含example.com的日志。
PUT and cn-shanghai表示查询同时包含关键字PUT和cn-shanghai的日志。
* | Select * where http_user_agent like '%like Gecko%'表示查询http_user_agent字段值中包含短语like Gecko的日志。
#"redo_index/1"表示查询包含短语redo_index/1的日志。
|
模糊查询 | 在查询语句中指定一个64个字符以内的词,在词的中间或者末尾加上模糊查询关键字,即星号(*)或问号(?),日志服务会在所有日志中为您查询到符合条件的100个词,返回包含这100个词并满足查询条件的所有日志。指定的词越精确,查询结果越精确。 | request_time>60 and request_method:Ge*表示查询request_time字段值大于60且request_method字段值以Ge开头的日志。
addr*表示在所有日志中查找以addr开头的100个词,并返回包含这些词的日志。
host:www.yl*表示在所有日志中查找host字段值以www.yl开头的100个词,并返回包含这些词的日志。
更多信息,请参见如何模糊查询日志?。 |
查询语句示例
同一条查询语句,针对不同的日志内容和索引配置时,会有不同的查询结果。本文基于如下日志样例和索引介绍查询语句示例。
text、double、long类型
日志样例
本文以Nginx访问日志为例,介绍常见的查询语句。

索引配置
在查询日志前,请确保已创建索引。检查索引配置的步骤,如下所示:
在Logstore的查询/分析页面,选择。
在打开的查询分析页面,查看是否已配置字段索引。
普通查询示例
查询需求 | 查询语句 | 调试 |
查询GET请求成功(状态码为200~299)的日志。 | request_method:GET and status in [200 299]
| 调试 |
查询来自非杭州地域的GET请求的日志。 | request_method:GET not region:cn-hangzhou
| 无 |
查询GET请求或POST请求的日志。 | request_method:GET or request_method:POST
| 调试 |
查询非GET请求的日志。 | not request_method:GET
| 调试 |
查询GET请求或POST请求成功的日志。 | (request_method:GET or request_method:POST) and status in [200 299]
| 调试 |
查询GET请求或POST请求失败的日志。 | (request_method:GET or request_method:POST) not status in [200 299]
| 调试 |
查询GET请求成功(状态码为200~299)且请求时间小于60秒的日志。 | request_method:GET and status in [200 299] not request_time>=60
| 调试 |
查询请求时间为60秒的日志。 | request_time:60
| 调试 |
request_time=60
| 调试 |
查询请求时间大于等于60秒,并且小于200秒的日志。 | request_time>=60 and request_time<200
| 调试 |
request_time in [60 200)
| 调试 |
查询request_time字段是否存在。 | request_time:*
| 调试 |
查询request_time字段值为空或非法数字的日志。 | (request_time:"") or (not request_time > -10000000000)
| 调试 |
查询包含request_time字段且字段值为数字的日志。 | request_time > -1000000000
| 调试 |
查询包含and的日志。 | "and"
| 调试 |
查询request method字段值是PUT的日志。 | "request method":PUT
重要 字段名request method中存在空格,在查询时需使用双引号("")包裹。 | 无 |
查询日志主题为HTTPS或HTTP的日志。 | __topic__:HTTPS or __topic__:HTTP
| 无 |
查询采集于192.0.2.1主机的日志。 | __tag__:__client_ip__:192.0.2.1
此处的__tag__:__client_ip__为日志服务保留字段,表示日志所在主机的IP地址。更多信息,请参见保留字段。
重要 通过数据加工或者Logtail插件处理的日志,其tag中的key会被转换成普通key,即查询时需使用双引号("")包裹字段名,例如"__tag__:__client_ip__":192.0.2.1。 | 无 |
查询包含192.168.XX.XX的日志。 | * | select * from log where key like '192.168.%.%'
更多信息,请参见通过SQL的like语法进行精确的模糊查询。 | 无 |
查询remote_user字段值不为空的日志。 | not remote_user:""
| 调试 |
查询remote_user字段值为空的日志。 | remote_user:""
| 调试 |
查询remote_user字段值不为null的日志。 | not remote_user:"null"
| 调试 |
查询不存在remote_user字段的日志。 | not remote_user:*
| 调试 |
查询存在remote_user字段的日志。 | remote_user:*
| 调试 |
查询城市字段值不为上海的日志。 | not 城市:上海
说明 当查询中文字符串时,需要在配置索引时,打开包含中文开关。更多信息,请参见创建索引。 | 无 |
模糊查询示例
查询需求 | 查询语句 | 调试 |
查询包含以cn开头的词的日志。 | cn*
| 调试 |
查询region字段值是以cn开头的日志。 | region:cn*
| 无 |
查询region字段值包含cn*的日志。 | region:"cn*"
说明 此处的cn*为一个独立词。例如: 如果日志内容为region:cn*,en,分词符为半角逗号(,),则该日志内容被拆分为region、cn*和en,您可以通过上述语句查询到该日志。 如果日志内容为region:cn*hangzhou,则cn*hangzhou为一个整体,您执行上述语句无法查询到该日志。
| 无 |
查询包含以mozi开头,以la结尾,中间还有一个字符的词的日志。 | mozi?la
| 调试 |
查询包含以mo开头,以la结尾,中间包含零个、单个或多个字符的词的日志。 | mo*la
| 调试 |
查询包含以moz开头的词和以sa开头的词的日志。 | moz* and sa*
| 调试 |
查询region字段值以hai结尾的所有日志。 | 目前使用查询语句无法查询到对应的日志,您可以使用SQL分析中的Like语法进行查询。更多信息,请参见通过SQL的like语法进行精确的模糊查询。 *| select * from log where region like '%hai'
| 无 |
查询message字段值以"get_time: 0.开头的所有日志。 | 使用SQL分析中的like语法进行查询。 *| select message where message like '"get_time: 0.%'
或者使用SPL中的where指令进行过滤查询。 *| where message like '"get_time: 0.%'
| 无 |
基于分词符的查询示例
日志服务会根据分词符,将日志内容拆分成多个词。日志服务默认配置的分词符为, '";=()[]{}?@&<>/:\n\t\r。如果设置分词符为空,则字段值将被当成一个整体,您只能通过完整字符串或模糊查询查找对应的日志。如何设置分词符,请参见创建索引。
例如http_user_agent字段值为Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/192.0.2.0 Safari/537.2。
设置分词符为空时,该字段值将被当成一个整体,则使用http_user_agent:Chrome查询语句进行查询时,无法查询到日志。
设置分词符为, '";=()[]{}?@&<>/:\n\t\r后,该字段值拆分为Mozilla、5.0、Windows、NT、6.1、AppleWebKit、537.2、KHTML、like、Gecko、Chrome、192.0.2.0、Safari、537.2。可以使用http_user_agent:Chrome等查询语句进行查询。
重要 当查询关键字中包含分词符时,您可以使用短语查询或者Like语法。例如:
查询需求 | 查询语句 | 调试 |
查询http_user_agent字段值中包含Chrome的日志。 | http_user_agent:Chrome
| 调试 |
查询http_user_agent字段值中包含Linux和Chrome的日志。 | http_user_agent:Linux and http_user_agent:Chrome
| 调试 |
http_user_agent:"Linux Chrome"
| 调试 |
查询http_user_agent字段值中包含Firefox或Chrome的日志。 | http_user_agent:Firefox or http_user_agent:Chrome
| 调试 |
查询request_uri字段值包含/request/path-2的日志。 | request_uri:/request/path-2
| 调试 |
查询request_uri字段值以/request开头,但不包含/file-0的日志。 | request_uri:/request* not request_uri:/file-0
| 调试 |
完全匹配包含短语redo_index/1的日志。 |
说明 通过短语查询或者Like语法,可完全匹配目标短语。使用普通的精确查询,将匹配redo_index、1等词。 | 无 |
关键词转义示例
在查询语句中
使用""(双引号)包裹一个语法关键词,可以将该语法关键词转换成普通字符。在字段查询中""内的所有词被当成一个整体。
当字段名或字段值中存在特殊字符(空格、中文、:、-等)、语法关键词(and、or等)等内容时,需要使用""包裹。例如"and"表示查询包含and的日志,此处的and不代表运算符。
日志服务保留以下运算符的使用权,如果需要使用以下运算符作为查询关键字,请使用""包裹:sort、asc、desc、group by、avg、sum、min、max和limit。
通过数据加工或者Logtail插件处理的日志,其tag中的key会被转换成普通key,即查询时需使用""包裹字段名,例如"__tag__:__client_ip__":192.0.2.1,此处的__tag__:__client_ip__为日志服务保留字段,表示日志所在主机的IP地址。更多信息,请参见保留字段。
查询需求 | 查询语句 |
查询request method字段值为PUT的日志。字段名request method中存在空格,需使用双引号("")包裹。 | "request method":PUT
|
查询system error description字段值中包含DB的日志。字段名system error description中存在空格。 | "system error description":DB*
|
查询region字段值包含cn*的日志。这里的cn*为一个字符串。如果日志内容为region:cn*,en,分词符为半角逗号(,),则该日志内容被拆分为region、cn*和en,可通过右侧语句查询到该日志。 | region:"cn*"
|
查询remote_user字段值为空的日志。 | remote_user:""
|
查询Authorization字段值为Bearer 12345的日志。字段值Bearer 12345中存在空格。 | "Authorization": "Bearer 12345"
|
分析errorContent字段值包含The body is not valid json string的日志。字段值中存在空格。 | * | select * where errorContent like '%The body is not valid json string%'
|
查询采集于192.0.2.1主机的日志。 | "__tag__:__client_ip__":192.0.2.1
|
在分析语句中
查询需求 | 查询语句 |
查询包含192.168.XX.XX的日志。 | * | select * from log where key like '192.168.%.%'
|
计算请求时长的前10名。 | 列名top 10中存在空格,需使用双引号("")包裹。 * | SELECT max(request_time,10) AS "top 10"
|
统计不同请求状态对应的日志数量。 | 此处content字段的索引为JSON类型。更多信息,请参见如何查询和分析有索引的JSON字段。 * | SELECT "content.status", COUNT(*) AS PV GROUP BY "content.status"
|
json类型
日志样例
{
"timestamp": "2025-03-21T14:35:18Z",
"level": "ERROR",
"service": {
"name": "payment-processor",
"version": "v2.8.1",
"environment": "production"
},
"error": {
"code": 5031,
"message": "Failed to connect to third-party API",
"details": {
"endpoint": "https://api.paymentgateway.com/v3/verify",
"attempts": 3,
"last_response": {
"status_code": 504,
"headers": {
"Content-Type": "application/json",
"X-RateLimit-Limit": "100"
}
}
}
},
"user": {
"id": "usr-9a2b3c4d",
"session": {
"id": "sess-zxy987",
"device": {
"type": "mobile",
"os": "Android 14",
"network": "4G"
}
}
},
"trace": {
"correlation_id": "corr-6f5e4d3c",
"span_id": "span-00a1b2"
}
}
索引配置
在查询日志前,请确保已创建索引。检查索引配置的步骤,如下所示:
在Logstore的查询/分析页面,选择。
在打开的查询分析页面,查看是否已配置字段索引。

示例
查询需求 | 查询语句 |
查询请求错误的日志。 | level:error
|
查询用户ID为usr-9a2b3c4d的所有请求。 | user.id:usr-9a2b3c4d
|
查询用户ID为usr-9a2b3c4d,并且查看错误状态。 | user.id:usr-9a2b3c4d and error.details.last_response.status_code :504
|