Simple Log ServiceProject使用查詢語句對儲存在Logstore中的日誌進行篩選。篩選結果可獨立使用,也可以用於分析語句,進行更複雜的分析處理。本文通過查詢語句的編寫流程來為您介紹查詢語句中涉及的文法結構。
查詢語句編寫思路
查詢語句的編寫可分為以下三步:
本文中涉及的查詢樣本的原始日誌請參見調試。
確定查詢方式
如需對Logstore中的日誌進行查詢,則必須首先建立索引。如需要對某個欄位進行分析(SELECT語句),則必須建立欄位索引。建立欄位索引和全文索引的步驟,請參見建立索引。
不同的索引配置,會產生不同的查詢和分析結果,如果同時建立了全文索引和欄位索引,以欄位索引的配置為準。
根據建立索引的不同,Simple Log ServiceProject查詢可分為全文檢索查詢和欄位查詢。全文檢索查詢和欄位查詢區別如下:
在開啟全文索引後,Simple Log ServiceProject預設將整條日誌(除
__time__
以外所有欄位)設定為text類型。開啟欄位索引後,Simple Log ServiceProject支援四種索引欄位類型:text、json、long和double。
如果只建立全文索引,則只能使用全文檢索查詢。
如果已建立欄位索引,則按以下規則查詢:
double、long類型:只能根據欄位查詢文法進行查詢。
text類型:如您知曉關鍵詞屬於某個已建立索引的text類型欄位,建議使用欄位查詢文法。如果不確定關鍵詞的具體欄位,請使用全文檢索查詢文法。
如果沒有建立全文索引,全文檢索查詢文法僅在欄位索引是text類型的欄位中查詢。
如果已建立全文索引,全文檢索查詢文法會從所有text類型索引中查詢。
全文檢索查詢
全文檢索查詢不針對具體的欄位進行查詢,其查詢文法為: keywords1 [ [ and | or | not ] keywords2 ] ...
。
keywords1
是需要查詢的關鍵詞,可以使用 *
、?
進行模糊比對,也可以結合運算子如 and
、or
等聯合其他查詢條件一起查詢。
樣本1:如果您希望查詢關鍵詞為GET
相關的日誌。則查詢文法:GET
。
樣本2:如果您查詢關鍵詞為GET
或POST
相關的日誌。則查詢文法:GET or POST
。
欄位查詢
欄位查詢對應的欄位類型包含text、long、double和json,且針對具體的欄位進行查詢,其查詢文法為:
indexname1 [ : | > | >= | < | <= | = | in ] keyword1 [ [ and | or | not ] indexname2 ... ]
indexname1
是需要查詢的欄位名,當欄位名、表名等專有名詞中存在特殊字元(空格、中文等)、文法關鍵詞(and
、or
等)等內容時,則需要使用""
(雙引號)包裹。在查詢中使用引號,請參見如何在查詢和分析語句中使用引號。欄位索引涉及
long
、double
類型,可以使用比較子>
、>=
、<
、<=
、=
、in
。
樣本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
。
確定欄位類型
編寫查詢語句時需要考慮欄位類型的特點,合理使用運算子,快速、精準地鎖定目標日誌。
欄位類型
欄位類型 | 說明 | 可用運算子 |
字串類型的欄位。開啟全文索引後,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),例如 如果欄位名稱或者欄位值內有空格、冒號(:)、連字號(-)等特殊字元,請使用雙引號("")包裹欄位名稱或者欄位值,例如 |
|
如果多個關鍵詞之間沒有文法關鍵詞,預設為 |
|
|
|
|
| 用於提高括弧內查詢條件的優先順序。例如 |
| 使用
|
| 轉義符號,用於轉義 |
| 萬用字元查詢,匹配零個、單個、多個字元。例如 說明 Log Service會在所有日誌中為您查詢到合格100個詞,返回包含這100個詞並滿足查詢條件的所有日誌。 |
| 萬用字元查詢,匹配單個字元。例如 |
| 查詢某欄位值大於某數值的日誌。例如 |
| 查詢某欄位值大於或等於某數值的日誌。例如 |
| 查詢某欄位值小於某數值的日誌。例如 |
| 查詢某欄位值小於或等於某數值的日誌。例如 |
| 查詢某欄位值等於某數值的日誌。針對double、long類型的欄位, |
| 查詢某欄位值處於某數值範圍內的日誌,中括弧表示閉區間,小括弧表示開區間,兩個數字之間使用空格分隔。例如 重要 in只能為小寫字母。 |
| 查詢某個日誌源的日誌,支援萬用字元。例如 重要 Log Service中的__source__為保留欄位,可縮寫為source。如果您自訂的欄位中存在source欄位,則會與Log Service保留欄位source衝突,此時您需要使用Source、SOURCE等詞查詢自訂的欄位。 |
| 通過中繼資料資訊查詢日誌。例如 |
| 查詢某日誌主題下的日誌。例如 |
確定匹配模式
您可根據掌握的關鍵詞資訊及實際業務情境的需要靈活控制使用精準查詢還是模糊查詢。若無法找到想要的日誌,可參見文檔進行排查:查詢不到日誌的排查思路。
查詢方式 | 說明 | 樣本 |
精確查詢 | 使用完整的詞進行查詢。 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開頭的詞的日誌。 |
| |
查詢region欄位值是以cn開頭的日誌。 |
| 無 |
查詢region欄位值包含cn*的日誌。 |
說明 此處的
| 無 |
查詢包含以mozi開頭,以la結尾,中間還有一個字元的詞的日誌。 |
| |
查詢包含以mo開頭,以la結尾,中間包含零個、單個或多個字元的詞的日誌。 |
| |
查詢包含以moz開頭的詞和以sa開頭的詞的日誌。 |
| |
查詢region欄位值以hai結尾的所有日誌。 | 目前使用查詢語句無法查詢到對應的日誌,您可以使用SQL分析中的Like文法進行查詢。更多資訊,請參見通過SQL的like文法進行精確的模糊查詢。
| 無 |
基於分詞符的查詢
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欄位值中包含Linux和Chrome的日誌。 |
| |
| ||
查詢http_user_agent欄位值中包含Firefox或Chrome的日誌。 |
| |
查詢request_uri欄位值包含/request/path-2的日誌。 |
| |
查詢request_uri欄位值以/request開頭,但不包含/file-0的日誌。 |
| |
完全符合包含短語 |
說明 通過短語查詢或者Like文法,可完全符合目標短語。使用普通的精確查詢,將匹配 | 無 |
特殊情境查詢樣本
在查詢語句中
使用""
(雙引號)包裹一個文法關鍵詞,可以將該文法關鍵詞轉換成一般字元。在欄位查詢中""
內的所有詞被當成一個整體。
當欄位名或欄位值中存在特殊字元(空格、中文、
:
、-
等)、文法關鍵詞(and
、or
等)等內容時,需要使用""
包裹。例如"and"
表示查詢包含and的日誌,此處的and不代表運算子。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地址。更多資訊,請參見保留欄位。
查詢需求 | 查詢語句 |
查詢 |
|
查詢採集於 |
|
在分析語句中
當欄位名、表名等專有名詞中存在特殊字元(空格、中文、
:
、-
等)、文法關鍵詞(and
、or
等)等內容時,需要使用""
包裹。表示字串的字元必須使用
''
(單引號)包裹。無符號包裹或被""
(雙引號)包裹的字元表示欄位名或列名。例如:'status'
表示字串status,status
或"status"
表示日誌欄位status。
查詢需求 | 查詢語句 |
查詢包含 |
|
在查詢中使用引號,請參見如何在查詢和分析語句中使用引號?。
相關文檔
分析函數和文法,請參見分析函數和文法。
錯誤排查
日誌查詢樣本
查詢JSON日誌(欄位值為JSON對象、JSON數組)的查詢和分析的樣本,請參見查詢和分析JSON日誌和查詢和分析JSON日誌的常見問題。