Log Service提供一套查詢文法,用於指定日誌查詢時的過濾規則,從而篩選日誌中滿足條件的記錄,篩選結果可以用於分析語句,進行更複雜的分析處理。
查詢文法結構
基礎文法
查詢語句和分析語句以豎線(|)分割。查詢語句可單獨使用,分析語句必須與查詢語句一起使用。即分析功能是基於查詢結果或全量資料進行的。
查詢語句中建議不超過30個條件。
分析語句中不需要填寫FROM子句和WHERE子句,預設分析當前Logstore中的資料。分析語句不支援使用offset,不區分大小寫,末尾不需要加分號。
基本文法
查詢語句|分析語句
語句類型
說明
查詢語句
查詢條件,可以為關鍵詞、數值、數值範圍、空格、星號(*)等。
如果為空白格或星號(*),表示無過濾條件。更多資訊,請參見查詢文法。
分析語句
對查詢結果或全量資料進行計算和統計。
樣本
* | SELECT status, count(*) AS PV GROUP BY status
語句編寫流程
查詢語句的編寫流程為:首先根據查詢方式確定查詢文法,然後根據欄位類型選擇合適的運算子,最後確定匹配模式。
步驟一:確定查詢方式
如果需要對某個欄位進行分析(SELECT語句),必須建立欄位索引。建立欄位索引和全文索引的步驟,請參見文檔建立索引。
不同的索引配置,會產生不同的查詢和分析結果,如果同時建立了全文索引和欄位索引,以欄位索引的配置為準。
只建立全文索引:只能使用全文檢索查詢文法。
已建立欄位索引:
double、long類型:只能根據欄位查詢文法進行查詢。
text類型:如您知曉關鍵詞屬於某個已建立索引的text類型欄位,建議使用欄位查詢文法。如果不確定關鍵詞的具體欄位,請使用全文檢索查詢文法:
沒有建立全文索引,全文檢索查詢文法僅在欄位索引是text類型的欄位中查詢。
如果已建立全文索引,全文檢索查詢文法會從所有text類型索引中查詢。
全文檢索查詢文法
全文檢索查詢不針對具體的欄位進行查詢,其查詢文法為:
keywords1 [ [ and | or | not ] keywords2 ] ...
keywords1 是需要查詢的關鍵詞,可以使用 *、?進行模糊比對,也可以結合運算子如 and、or 等聯合其他查詢條件一起查詢。
案例1:希望查詢關鍵詞為 Nginx 相關的日誌。則查詢文法:Nginx
。
案例2:查詢關鍵詞為 Nginx 或 Tomcat 相關的日誌。則查詢文法:Nginx or Tomcat
。
欄位查詢文法
欄位查詢對應的欄位類型包含text
、long
、double
、JSON
,且針對具體的欄位進行查詢,其查詢文法為:
indexname1 [ : | > | >= | < | <= | = | in ] keyword1 [ [ and | or | not ] indexname2 ... ]
indexname1 是需要查詢的欄位名,當欄位名、表名等專有名詞中存在特殊字元(空格、中文等)、文法關鍵詞(and、or等)等內容時,則需要使用
""
(雙引號)包裹。在查詢中使用引號,請參見如何在查詢和分析語句中使用引號。欄位索引涉及
long
、double
類型,可以使用比較子>
、>=
、<
、<=
、=
、in
。
案例1:希望查詢 requestMethod 為 GET 相關的日誌。則查詢文法為:requestMethod: GET
。
案例2:希望查詢 requestTimeSpend 大於 500ms 相關的日誌。則查詢文法為requestTimeSpend > 500
(該欄位索引類型為long
)。
案例3:希望查詢 requestMethod 為 GET 且 requestTimeSpend 大於 500ms 相關的日誌。則查詢文法為:requestMethod: GET and requestTimeSpend > 500
。
步驟二:確定欄位類型
欄位類型
編寫查詢語句時需要考慮欄位類型的特點,合理使用運算子,快速、精準地鎖定目標日誌。
欄位類型 | 介紹 | 可用運算子 |
字串類型的欄位。開啟全文索引後,Log Service預設將整條日誌(除 |
| |
只有設定欄位的資料類型為long或double後,才能通過數值範圍查詢該欄位的值。
|
| |
針對JSON對象中的欄位,您可根據其值,將資料類型設定為long、double或text,並開啟統計功能。 | 根據JSON對象中的欄位的類型使用不同的運算子。 |
運算子
in運算子只能小寫,其他運算子不區分大小寫。
Log Service保留以下運算子的使用權,如果您需要使用以下運算子作為查詢關鍵字,請使用
""
(雙引號)包裹:sort、asc、desc、group by、avg、sum、min、max和limit。運算子的優先順序由高到低排序如下所示:
冒號(:)
雙引號("")
圓括弧()
and、not
or
運算子 | 說明 |
: | 用於欄位查詢(Key:Value),例如 如果欄位名稱或者欄位值內有空格、冒號(:)、連字號(-)等特殊字元,請使用雙引號("")包裹欄位名稱或者欄位值,例如 |
and | and運算子。例如 如果多個關鍵詞之間沒有文法關鍵詞,預設為and關係,例如 |
or | or運算子。例如 |
not | not運算子。例如 |
( ) | 用於提高括弧內查詢條件的優先順序。例如 |
"" | 使用雙引號("")包裹一個文法關鍵詞,可以將該文法關鍵詞轉換成一般字元。例如 在欄位查詢中雙引號("")內的所有詞被當成一個整體。 |
\ | 轉義符號,用於轉義雙引號(""),轉義後的引號表示符號本身。例如日誌內容為 |
* | 萬用字元查詢,匹配零個、單個、多個字元。例如 說明 Log Service會在所有日誌中為您查詢到合格100個詞,返回包含這100個詞並滿足查詢條件的所有日誌。 |
? | 萬用字元查詢,匹配單個字元。例如 |
> | 查詢某欄位值大於某數值的日誌。例如 |
>= | 查詢某欄位值大於或等於某數值的日誌。例如 |
< | 查詢某欄位值小於某數值的日誌。例如 |
<= | 查詢某欄位值小於或等於某數值的日誌。例如 |
= | 查詢某欄位值等於某數值的日誌。針對double、long類型的欄位,等號(=)和冒號(:)作用相同。例如 |
in | 查詢某欄位值處於某數值範圍內的日誌,中括弧表示閉區間,小括弧表示開區間,兩個數字之間使用空格分隔。例如 重要 in只能為小寫字母。 |
__source__ | 查詢某個日誌源的日誌,支援萬用字元。例如 重要 Log Service中的__source__為保留欄位,可縮寫為source。如果您自訂的欄位中存在source欄位,則會與Log Service保留欄位source衝突,此時您需要使用Source、SOURCE等詞查詢自訂的欄位。 |
__tag__ | 通過中繼資料資訊查詢日誌。例如 |
__topic__ | 查詢某日誌主題下的日誌。例如 |
步驟三:確定匹配模式
您可根據掌握的關鍵詞資訊及實際業務情境的需要靈活控制使用精準查詢還是模糊查詢。若無法找到想要的日誌,可參見文檔進行排查:查詢不到日誌的排查思路。
查詢方式 | 說明 | 樣本 |
精確查詢 | 使用完整的詞進行查詢。 Log Service查詢採用的是分詞法,精確查詢時並不能完全符合關鍵詞。例如查詢語句為 |
|
模糊查詢 | 在查詢語句中指定一個64個字元以內的詞,在詞的中間或者末尾加上模糊查詢關鍵字,即星號(*)或問號(?),Log Service會在所有日誌中為您查詢到合格100個詞,返回包含這100個詞並滿足查詢條件的所有日誌。指定的詞越精確,查詢結果越精確。 重要
模糊查詢是一種採樣查詢,查詢機制如下所示:
|
更多資訊,請參見如何模糊查詢日誌?。 |
查詢語句樣本
同一條查詢語句,針對不同的日誌內容和索引配置時,會有不同的查詢結果。本文基於如下日誌範例和索引介紹查詢語句樣本。
日誌範例
本文以Nginx訪問日誌為例,介紹常見的查詢語句。
索引配置
普通查詢樣本
查詢需求 | 查詢語句 | 調試 |
查詢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'
無
基於分詞符的查詢
Log Service會根據分詞符,將日誌內容拆分成多個詞。Log Service預設配置的分詞符為
, '";=()[]{}?@&<>/:\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等)等內容時,需要使用雙引號("")包裹。
Log Service保留以下運算子的使用權,如果您需要使用以下運算子作為查詢關鍵字,請使用""(雙引號)包裹:sort、asc、desc、group by、avg、sum、min、max和limit。
通過資料加工或者Logtail外掛程式處理的日誌,其tag中的key會被轉換成普通key,即查詢時需使用雙引號("")包裹欄位名,例如
"__tag__:__client_ip__":192.0.2.1
,此處的__tag__:__client_ip__
為Log Service保留欄位,表示日誌所在主機的IP地址。更多資訊,請參見保留欄位。
查詢需求 | 查詢語句 | 調試 |
查詢 |
| 無 |
查詢採集於192.0.2.1主機的日誌。 |
| 無 |
在分析語句中
當欄位名、表名等專有名詞中存在特殊字元(空格、中文、冒號(:)、連字號(-)等)、文法關鍵詞(and、or等)等內容時,需要使用雙引號("")包裹。
表示字串的字元必須使用單引號('')包裹,無符號包裹或被雙引號("")包裹的字元表示欄位名或列名。例如:
'status'
表示字串status,status
或"status"
表示日誌欄位status。
查詢需求 | 查詢語句 | 調試 |
查詢包含 |
| 無 |
在查詢中使用引號,請參見如何在查詢和分析語句中使用引號?。
相關文檔
分析函數和文法,請參見分析函數和文法。
錯誤排查
日誌查詢樣本
查詢JSON日誌(欄位值為JSON對象、JSON數組)的查詢和分析的樣本,請參見查詢和分析JSON日誌和查詢和分析JSON日誌的常見問題。