Log Service掃描(Scan)查詢功能支援免配置索引進行目標欄位的掃描,用於查詢相關日誌,並且支援通過SPL語句對查詢結果進行進一步的過濾、轉換、解析等操作。本文介紹掃描查詢基本文法。
工作流程
Log Service接收到掃描請求後,執行流程主要分為如下兩步。
先執行對應的查詢語句進行日誌查詢。
重要第一級管道的查詢語句依賴於索引查詢,無需索引過濾時可以寫
*。例如執行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條。 | 滿足下述任一條件,本次掃描結束並返回掃描結果。
|
費用 | 索引流量和索引儲存費用。更多資訊,請參見按使用功能計費模式計費項目。 | 掃描部分按照流量收費,即基於索引查詢後掃描命中的資料量收費。 |