日志服务扫描(Scan)查询功能支持免配置索引进行目标字段的扫描,用于查询相关日志,并且支持通过SPL语句对查询结果进行进一步的过滤、转换、解析等操作。本文介绍扫描查询基本语法。
工作流程
日志服务接收到扫描请求后,执行流程主要分为如下两步。
先执行对应的查询语句进行日志查询。
重要第一级管道的查询语句依赖于索引查询,无需索引过滤时可以写
*
。例如执行status:200 | WHERE userId = '123' | extend host=upper(hostname)
语句前,您需为status
字段创建索引,但无需为userId
字段和hostname
字段创建索引。上述索引查询结果的日志,经过SPL语句处理(过滤、转换、解析等操作),处理后的结果作为最终的查询结果。
基本语法
扫描查询模式支持SPL(SLS Processing Language),更多信息请参见SPL语法。对于读取出的原始数据,可以通过SPL语句做结构化信息提取、字段操作、数据过滤等操作,并支持多级管道级联,第一级管道是索引过滤条件,后面的多级管道是SPL指令,最终输出经过SPL处理后的结果数据。
索引查询语句 | <spl-cmd> ... | <spl-cmd> ...
日志样例
原始字段:标识 [R],适用于扫描搜索。
索引字段:标识 [I],适用于索引搜索。
[I] __topic__: nginx-access-log
[I] Status: 200
[I] Host: api.abc.com
[R] Method: PUT
[R] ClientIp: 192.168.1.1
[R] Payload: {"Item": "1122", "UserId": "112233", "Operation": "AddCart"}
[R] BeginTime: 1705029260
[R] EndTime: 1705028561
[R] RT: 87
[R] Uri: /request/path-3/file-1
[R] UserAgent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ar) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4
示例
SPL语句中的常量字符串使用单引号(')包裹,比如
* | where ClientIp = '192.168.1.1'
如果字段名称中有特殊符号,对字段名称使用双引号(")包裹,比如
* | project-away "user-agent"
按照不同条件进行过滤
等值比较。
Status: 200 | where ClientIp = '192.168.1.1'
大小写不敏感搜索。
__topic__: nginx-access-log | where lower(Method) != 'put'
模糊匹配。
Status: 200 | where UserAgent like '%Macintosh%'
数值比较。
注意字段类型默认是varchar,进行数值比较时要先将类型转换成bigint。
Status: 200 | where cast(RT as bigint) > 50
正则匹配。
# 找出包含"path-数字"的Uri Status: 200 | where regexp_like(Uri, 'path-\d+')
计算出新的字段
通过extend指令,可以从已有的字段信息中,计算出新的字段。
从正则提取字段。
# 提取出Uri字段里的文件名编号 * not Status: 200 | extend fileNumber=regexp_extract(Uri, 'file-(\d+)', 1)
从JSON提取字段。
Status:200 | extend Item = json_extract_scalar(Payload, '$.Item')
按照分隔符提取。
Status:200 | extend urlParam=split_part(Uri, '/', 3)
根据多个字段值计算出新的字段。
#根据BeginTime和EndTime计算出时间差 Status:200 | extend timeRange = cast(BeginTime as bigint) - cast(EndTime as bigint)
保留、移除、重命名字段
仅保留某些字段(移除所有其他字段)。
Status:200 | project Status, Uri
移除某些字段(其它字段保留)。
Status:200 | project-away UserAgent
重命名字段。
Status:200 | project-rename Latency=RT
展开非结构化数据
展开JSON中的所有字段。
#过滤Payload非空的,并且将所有的json字段展开 __topic__: nginx-access-log | where Payload is not null | parse-json Payload
将JSON字段展开,丢弃原有的JSON字段。
status:200 | parse-json body | project-away body
正则提取出多个字段。
Status:200 | parse-regexp Uri, 'path-(\d+)/file-(\d+)' as pathIndex, fileIndex
多级管道级联
以上示例中所有操作,都可以在同一个查询语句中,通过多级管道级联,执行顺序是从前往后依次执行。
Status:200
| where Payload is not null
| parse-json Payload
| project-away Payload
| where Host='api.qzzw.com' and cast(RT as bigint) > 80
| extend timeRange=cast(BeginTime as bigint) - cast(EndTime as bigint)
| where timeRange > 500
| project UserId, Uri
使用限制
扫描模式下执行SPL,运行时相关限制,请参见使用限制。
不支持随机翻页。
索引查询与扫描查询对比
对比项 | 索引查询 | 扫描查询 |
语法 |
更多信息,请参见查询语法与功能。 |
更多信息,请参见SPL语法。 |
是否需要配置索引 | 需要。 | 不需要。 重要 第一级竖线(|)前的索引查询语句仍依赖于索引。 |
是否支持搭配分析语句 | 支持。 | 支持。 |
是否支持随机翻页 | 支持。 | 不支持。 只能连续翻页(前翻或后翻)。 |
日志直方图 | 基于查询语句的查询结果进行展示。 | 基于查询语句的查询结果、扫描进度进行展示。 |
运算符与函数 | 支持逻辑、数学运算;支持模糊查询;不支持SQL函数。 | |
字段类型 | 由索引配置中的数据类型决定。更多信息,请参见数据类型。 | 无论字段是否已配置索引,在扫描模式下 SP语句中出现的字段均按照text类型处理。详情请参考数据类型转换。 |
结果集大小 | 通过控制台或SDK指定,最大100条。 | 满足下述任一条件,本次扫描结束并返回扫描结果。
|
费用 | 索引流量和索引存储费用。更多信息,请参见按使用功能计费模式计费项。 | 扫描部分按照流量收费,即基于索引查询后扫描命中的数据量收费。 |