日志服务 Project支持使用查询语句对存储在Logstore中的日志进行筛选。筛选结果可独立使用,也可以用于分析语句,进行更复杂的分析处理。本文介绍查询语句的语法结构,以及应用场景和具体示例。
基础语法
查询语句和分析语句以
|
分割。其格式为:
查询语句|分析语句
查询语句可单独使用,分析语句必须与查询语句一起使用。即分析功能是基于查询结果或全量数据进行的。
-
查询语句中建议不超过30个条件。
-
分析语句中无需填写FROM子句和WHERE子句,默认分析当前Logstore中的数据。分析语句不支持使用offset,不区分大小写,末尾无需加分号。
语句类型 |
说明 |
查询语句 |
查询条件,可以为关键词、数值、数值范围、空格、星号(*)等。 如果为空格或星号(*),表示无过滤条件。 |
分析语句 |
对查询结果或全量数据进行计算和统计。日志服务支持的分析函数和语法,请参见: |
查询和分析语句示例:
* | SELECT status, count(*) AS PV GROUP BY status
本文中涉及的查询示例的原始日志请参见 调试 。
查询语句编写思路
查询语句的编写流程可分为以下三步:
步骤一:确定查询方式
步骤二:确定字段类型
步骤三:确定匹配模式
查询语句示例
同一条查询语句,针对不同的日志内容和索引配置时,会有不同的查询结果。本文基于如下日志样例和索引介绍查询语句示例。
日志样例
本文以Nginx访问日志为例,介绍常见的查询语句。
索引配置
在查询日志前,请确保已配置索引。更多信息,请参见 创建索引 。检查索引配置的步骤,如下所示:
-
在Logstore的 查询/分析 页面,选择
。 -
在打开的查询分析页面,查看是否已配置字段索引。
普通查询示例
查询需求 |
查询语句 |
调试 |
查询GET请求成功(状态码为200~299)的日志。 |
|
|
查询来自非杭州地域的GET请求的日志。 |
|
无 |
查询GET请求或POST请求的日志。 |
|
|
查询非GET请求的日志。 |
|
|
查询GET请求或POST请求成功的日志。 |
|
|
查询GET请求或POST请求失败的日志。 |
|
|
查询GET请求成功(状态码为200~299)且请求时间小于60秒的日志。 |
|
|
查询请求时间为60秒的日志。 |
|
|
|
||
查询请求时间大于等于60秒,并且小于200秒的日志。 |
|
|
|
||
查询 request_time 字段值为空或非法数字的日志。 |
说明
|
|
查询包含 request_time 字段且字段值为数字的日志。 |
|
|
查询包含 and 的日志。 |
说明
此处的 and 为普通字符串,不代表运算符。 |
|
查询 request method 字段值是 PUT 的日志。 |
重要
字段名 request method 中存在空格,在查询时需使用双引号("")包裹。 |
无 |
查询日志主题为HTTPS或HTTP的日志。 |
|
无 |
查询采集于 192.0.2.1 主机的日志。 |
此处的
重要
通过数据加工或者Logtail插件处理的日志,其tag中的key会被转换成普通key,即查询时需使用双引号("")包裹字段名,例如
|
无 |
查询包含
|
更多信息,请参见 通过SQL的like语法进行精确的模糊查询 。 |
无 |
查询 remote_user 字段值不为空的日志。 |
|
|
查询 remote_user 字段值为空的日志。 |
|
|
查询 remote_user 字段值不为 null 的日志。 |
|
|
查询不存在 remote_user 字段的日志。 |
|
|
查询存在 remote_user 字段的日志。 |
|
|
查询 城市 字段值不为 上海 的日志。 |
说明
当您要查询中文字符串时,您需要在配置索引时,打开 包含中文 开关。更多信息,请参见 创建索引 。 |
无 |
进阶查询示例
-
模糊查询
查询需求
查询语句
调试
查询包含以 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'
无
-
-
基于分词符的查询
日志服务会根据分词符,将日志内容拆分成多个词。日志服务默认配置的分词符为
, '";=()[]{}?@&<>/:\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语法。例如:
-
短语查询:
#"redo_index/1"
。更多信息,请参见 短语查询 。 -
Like语法:
* | select * from log where key like 'redo_index/1'
。
查询需求
查询语句
调试
查询 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
的日志。-
#"redo_index/1"
-
* | select * from log where key like '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
查询采集于
192.0.2.1
主机的日志。"__tag__:__client_ip__":192.0.2.1
-
-
在分析语句中
-
当字段名、表名等专有名词中存在特殊字符(空格、中文、
:
、-
等)、语法关键词(and
、or
等)等内容时,需要使用""
包裹。 -
表示字符串的字符必须使用
''
(单引号)包裹。无符号包裹或被""
(双引号)包裹的字符表示字段名或列名。例如:'status'
表示字符串status,status
或"status"
表示日志字段status。
查询需求
查询语句
查询包含
192.168.XX.XX
的日志。* | select * from log where key like '192.168.%.%'
在查询中使用引号, 如何在查询和分析语句中使用引号?
-
相关文档
-
分析函数和语法,请参见 分析函数和语法 。
-
错误排查
-
日志查询示例
-
查询JSON日志(字段值为JSON对象、JSON数组)的查询和分析的示例,请参见 查询和分析JSON日志 和 查询和分析JSON日志的常见问题 。