全部產品
Search
文件中心

Simple Log Service:查詢文法

更新時間:Nov 19, 2024

Simple Log ServiceProject使用查詢語句對儲存在Logstore中的日誌進行篩選。篩選結果可獨立使用,也可以用於分析語句,進行更複雜的分析處理。本文通過查詢語句的編寫流程來為您介紹查詢語句中涉及的文法結構。

查詢語句編寫思路

查詢語句的編寫可分為以下三步:

  1. 確定查詢方式

  2. 確定欄位類型

  3. 確定匹配模式

說明

本文中涉及的查詢樣本的原始日誌請參見調試

確定查詢方式

重要
  • 如需對Logstore中的日誌進行查詢,則必須首先建立索引。如需要對某個欄位進行分析(SELECT語句),則必須建立欄位索引。建立欄位索引和全文索引的步驟,請參見建立索引

  • 不同的索引配置,會產生不同的查詢和分析結果,如果同時建立了全文索引和欄位索引,以欄位索引的配置為準。

根據建立索引的不同,Simple Log ServiceProject查詢可分為全文檢索查詢欄位查詢全文檢索查詢欄位查詢區別如下:

  • 在開啟全文索引後,Simple Log ServiceProject預設將整條日誌(除__time__以外所有欄位)設定為text類型。

  • 開啟欄位索引後,Simple Log ServiceProject支援四種索引欄位類型:textjsonlongdouble

  • 如果只建立全文索引,則只能使用全文檢索查詢。

  • 如果已建立欄位索引,則按以下規則查詢:

    • doublelong類型:只能根據欄位查詢文法進行查詢。

    • text類型:如您知曉關鍵詞屬於某個已建立索引的text類型欄位,建議使用欄位查詢文法。如果不確定關鍵詞的具體欄位,請使用全文檢索查詢文法。

      • 如果沒有建立全文索引,全文檢索查詢文法僅在欄位索引是text類型的欄位中查詢。

      • 如果已建立全文索引,全文檢索查詢文法會從所有text類型索引中查詢。

全文檢索查詢

全文檢索查詢不針對具體的欄位進行查詢,其查詢文法為: keywords1 [ [ and | or | not ] keywords2 ] ...

keywords1 是需要查詢的關鍵詞,可以使用 *進行模糊比對,也可以結合運算子如 andor 等聯合其他查詢條件一起查詢。

樣本1:如果您希望查詢關鍵詞為GET相關的日誌。則查詢文法:GET

樣本2:如果您查詢關鍵詞為GETPOST相關的日誌。則查詢文法:GET or POST

欄位查詢

欄位查詢對應的欄位類型包含textlongdoublejson,且針對具體的欄位進行查詢,其查詢文法為:

indexname1 [ : | > | >= | < | <= | = | in ] keyword1 [ [ and | or | not ] indexname2 ... ]

重要
  • indexname1 是需要查詢的欄位名,當欄位名、表名等專有名詞中存在特殊字元(空格、中文等)、文法關鍵詞(andor等)等內容時,則需要使用""(雙引號)包裹。在查詢中使用引號,請參見如何在查詢和分析語句中使用引號

  • 欄位索引涉及longdouble類型,可以使用比較子>>=<<==in

樣本1:如果您希望查詢 request_methodGET 相關的日誌,則查詢文法為: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

確定欄位類型

編寫查詢語句時需要考慮欄位類型的特點,合理使用運算子,快速、精準地鎖定目標日誌。

欄位類型

欄位類型

說明

可用運算子

text類型

字串類型的欄位。開啟全文索引後,Log Service預設將整條日誌(除__time__以外所有欄位)設定為text類型。

andornot():""\*?

long和double類型

只有設定欄位的資料類型為longdouble後,才能通過數值範圍查詢該欄位的值。

  • 如果欄位的資料類型不被設定為doublelong或者查詢時數值範圍的語法錯誤,那麼Log Service會按照全文檢索查詢方式進行查詢,這樣查詢到的結果可能與您期望的結果不同。

    例如欄位owner_id不是doublelong類型,則執行查詢語句owner_id>100時,會返回同時包含owner_id>(非分詞符)、100這三個詞的日誌。

  • 如果將欄位的類型從text類型改成doublelong類型,則只支援等號=查詢。如果需要使用範圍查詢、大於符號(>)、小於符號(<)等運算子,必須重建索引

andornot()>>=<<==in

JSON類型

針對JSON對象中的欄位,您可根據其值,將資料類型設定為longdoubletext,並開啟統計功能。

根據JSON對象中的欄位的類型使用不同的運算子。

運算子

重要
  • in運算子只能小寫,其他運算子不區分大小寫。

  • Log Service保留以下運算子的使用權,如果您需要使用以下運算子作為查詢關鍵字,請使用""(雙引號)包裹:sortascdescgroup byavgsumminmaxlimit

  • 運算子的優先順序由高到低排序如下所示:

    1. 冒號(:)

    2. 雙引號("")

    3. 圓括弧()

    4. and、not

    5. or

運算子

說明

:

用於欄位查詢(Key:Value),例如request_method:GET

如果欄位名稱或者欄位值內有空格、冒號(:)、連字號(-)等特殊字元,請使用雙引號("")包裹欄位名稱或者欄位值,例如"file info":apsara

and

and運算子。例如request_method:GET and status:200

如果多個關鍵詞之間沒有文法關鍵詞,預設為and關係,例如GET 200 cn-shanghai等同於GET and 200 and cn-shanghai

or

or運算子。例如request_method:GET or status:200

not

not運算子。例如request_method:GET not status:200not status:200

( )

用於提高括弧內查詢條件的優先順序。例如(request_method:GET or request_method:POST) and status:200

""

使用""(雙引號)包裹一個文法關鍵詞,可以將該文法關鍵詞轉換成一般字元。在欄位查詢中""內的所有詞被當成一個整體。

  • 當欄位名或欄位值中存在特殊字元(空格、中文、:-等)、文法關鍵詞(andor等)等內容時,需要使用""包裹。例如"and"表示查詢包含and的日誌,此處的and不代表運算子。

  • Log Service保留以下運算子的使用權,如果您需要使用以下運算子作為查詢關鍵字,請使用""包裹:sortascdescgroup byavgsumminmaxlimit

  • 通過資料加工或者Logtail外掛程式處理的日誌,其tag中的key會被轉換成普通key,即查詢時需使用""包裹欄位名,例如"__tag__:__client_ip__":192.0.2.1,此處的__tag__:__client_ip__為Log Service保留欄位,表示日誌所在主機的IP地址。更多資訊,請參見保留欄位

\

轉義符號,用於轉義""(雙引號),轉義後的雙引號表示符號本身。例如日誌內容為instance_id:nginx"01",您可以使用instance_id:nginx\"01\"進行查詢。

*

萬用字元查詢,匹配零個、單個、多個字元。例如host:www*com

說明

Log Service會在所有日誌中為您查詢到合格100個詞,返回包含這100個詞並滿足查詢條件的所有日誌。

?

萬用字元查詢,匹配單個字元。例如host:aliyund?c

>

查詢某欄位值大於某數值的日誌。例如request_time>100

>=

查詢某欄位值大於或等於某數值的日誌。例如request_time>=100

<

查詢某欄位值小於某數值的日誌。例如request_time<100

<=

查詢某欄位值小於或等於某數值的日誌。例如request_time<=100

=

查詢某欄位值等於某數值的日誌。針對double、long類型的欄位,=:作用相同。例如request_time=100等同於request_time:100

in

查詢某欄位值處於某數值範圍內的日誌,中括弧表示閉區間,小括弧表示開區間,兩個數字之間使用空格分隔。例如request_time in [100 200]request_time in (100 200]

重要

in只能為小寫字母。

__source__

查詢某個日誌源的日誌,支援萬用字元。例如__source__:192.0.2.*

重要

Log Service中的__source__為保留欄位,可縮寫為source。如果您自訂的欄位中存在source欄位,則會與Log Service保留欄位source衝突,此時您需要使用SourceSOURCE等詞查詢自訂的欄位。

__tag__

通過中繼資料資訊查詢日誌。例如__tag__:__receive_time__:1609837139

__topic__

查詢某日誌主題下的日誌。例如__topic__:nginx_access_log

確定匹配模式

您可根據掌握的關鍵詞資訊及實際業務情境的需要靈活控制使用精準查詢還是模糊查詢。若無法找到想要的日誌,可參見文檔進行排查:查詢不到日誌的排查思路

查詢方式

說明

樣本

精確查詢

使用完整的詞進行查詢。

Log Service查詢採用的是分詞法,精確查詢時並不能完全符合關鍵詞。例如查詢語句為abc def,查詢結果將包含所有abcdef的日誌,無法完全符合目標短語。如果您要完全符合短語abc def,可以使用短語查詢或者Like文法。更多資訊,請參見短語查詢如何精準查詢日誌

  • host:example.com表示查詢host欄位值包含example.com的日誌。

  • PUT and cn-shanghai表示查詢同時包含關鍵字PUTcn-shanghai的日誌。

  • * | Select * where http_user_agent like '%like Gecko%'表示查詢http_user_agent欄位值中包含短語like Gecko的日誌。

  • #"redo_index/1"表示查詢包含短語redo_index/1的日誌。

模糊查詢

在查詢語句中指定一個64個字元以內的詞,在詞的中間或者末尾加上模糊查詢關鍵字,即星號(*)或問號(?),Log Service會在所有日誌中為您查詢到合格100個詞,返回包含這100個詞並滿足查詢條件的所有日誌。指定的詞越精確,查詢結果越精確。

重要
  • 星號(*)或問號(?)不能用在詞的開頭。

  • long資料類型和double資料類型不支援使用星號(*)或問號(?)進行模糊查詢。您可以使用數值範圍進行模糊查詢,例如status in [200 299]。

模糊查詢是一種採樣查詢,查詢機制如下所示:

  • 當您開啟欄位索引,且指定某個欄位進行查詢時,Log Service從該欄位的索引資料中隨機採樣,返回部分結果並不是全量掃描底層資料。

  • 當您開啟全文索引,且沒有指定某個欄位進行查詢時,Log Service從全文索引資料中隨機採樣,返回部分結果並不是全量掃描底層資料。

  • request_time>60 and request_method:Ge*表示查詢request_time欄位值大於60request_method欄位值以Ge開頭的日誌。

  • addr*表示在所有日誌中尋找以addr開頭的100個詞,並返回包含這些詞的日誌。

  • host:www.yl*表示在所有日誌中尋找host欄位值以www.yl開頭的100個詞,並返回包含這些詞的日誌。

更多資訊,請參見如何模糊查詢日誌?

查詢語句樣本

同一條查詢語句,針對不同的日誌內容和索引配置時,會有不同的查詢結果。本文基於如下日誌範例和索引介紹查詢語句樣本。

日誌範例

本文以Nginx訪問日誌為例,介紹常見的查詢語句。

日誌範例

索引配置

在查詢日誌前,請確保已配置索引。更多資訊,請參見建立索引

在查詢頁面點擊查詢分析屬性,選擇屬性,如下圖。

image

進行查看,以下是設定的索引列。

索引

普通查詢樣本

查詢需求

查詢語句

調試

查詢GET請求成功(狀態代碼為200~299)的日誌。

request_method:GET and status in [200 299]

調試

查詢來自非杭州地區的GET請求的日誌。

request_method:GET not region:cn-hangzhou

查詢GET請求或POST請求的日誌。

request_method:GET or request_method:POST

調試

查詢非GET請求的日誌。

not request_method:GET

調試

查詢GET請求或POST請求成功的日誌。

(request_method:GET or request_method:POST) and status in [200 299]

調試

查詢GET請求或POST請求失敗的日誌。

(request_method:GET or request_method:POST) not status in [200 299]

調試

查詢GET請求成功(狀態代碼為200~299)且請求時間小於60秒的日誌。

request_method:GET and status in [200 299] not request_time>=60

調試

查詢請求時間為60秒的日誌。

request_time:60

調試

request_time=60

調試

查詢請求時間大於等於60秒,並且小於200秒的日誌。

request_time>=60 and request_time<200

調試

request_time in [60 200)

調試

查詢request_time欄位值為空白或非法數位日誌。

request_time:* not request_time > -10000000000
說明

request_time:*用於判斷request_time欄位是否存在。此處的星號(*)不代表模糊查詢。

調試

查詢包含request_time欄位且欄位值為數位日誌。

request_time > -1000000000

調試

查詢包含and的日誌。

"and"
說明

此處的and為一般字元串,不代表運算子。

調試

查詢request method欄位值是PUT的日誌。

"request method":PUT
重要

欄位名request method中存在空格,在查詢時需使用雙引號("")包裹。

查詢日誌主題為HTTPS或HTTP的日誌。

__topic__:HTTPS or __topic__:HTTP

查詢採集於192.0.2.1主機的日誌。

__tag__:__client_ip__:192.0.2.1

此處的__tag__:__client_ip__為Log Service保留欄位,表示日誌所在主機的IP地址。更多資訊,請參見保留欄位

重要

通過資料加工或者Logtail外掛程式處理的日誌,其tag中的key會被轉換成普通key,即查詢時需使用雙引號("")包裹欄位名,例如"__tag__:__client_ip__":192.0.2.1

查詢包含192.168.XX.XX的日誌。

* | select * from log where key like '192.168.%.%'

更多資訊,請參見通過SQL的like文法進行精確的模糊查詢

查詢remote_user欄位值不為空白的日誌。

not remote_user:""

調試

查詢remote_user欄位值為空白的日誌。

remote_user:""

調試

查詢remote_user欄位值不為null的日誌。

not remote_user:"null"

調試

查詢不存在remote_user欄位的日誌。

not remote_user:*

調試

查詢存在remote_user欄位的日誌。

remote_user:*

調試

查詢城市欄位值不為上海的日誌。

not 城市:上海
說明

當您要查詢中文字串時,您需要在配置索引時,開啟包含中文開關。更多資訊,請參見建立索引

進階查詢樣本

模糊查詢

查詢需求

查詢語句

調試

查詢包含以cn開頭的詞的日誌。

cn*

調試

查詢region欄位值是以cn開頭的日誌。

region:cn*

查詢region欄位值包含cn*的日誌。

region:"cn*"
說明

此處的cn*為一個獨立詞。例如:

  • 如果日誌內容為region:cn*,en,分詞符為半形逗號(,),則該日誌內容被拆分為regioncn*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後,該欄位值為拆分為Mozilla5.0WindowsNT6.1AppleWebKit537.2KHTMLlikeGeckoChrome192.0.2.0Safari537.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欄位值中包含LinuxChrome的日誌。

http_user_agent:Linux and http_user_agent:Chrome

調試

http_user_agent:"Linux Chrome"

調試

查詢http_user_agent欄位值中包含FirefoxChrome的日誌。

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_index1等詞。

特殊情境查詢樣本

在查詢語句中

使用""(雙引號)包裹一個文法關鍵詞,可以將該文法關鍵詞轉換成一般字元。在欄位查詢中""內的所有詞被當成一個整體。

  • 當欄位名或欄位值中存在特殊字元(空格、中文、:-等)、文法關鍵詞(andor等)等內容時,需要使用""包裹。例如"and"表示查詢包含and的日誌,此處的and不代表運算子。

  • Log Service保留以下運算子的使用權,如果您需要使用以下運算子作為查詢關鍵字,請使用""包裹:sortascdescgroup byavgsumminmaxlimit

  • 通過資料加工或者Logtail外掛程式處理的日誌,其tag中的key會被轉換成普通key,即查詢時需使用""包裹欄位名,例如"__tag__:__client_ip__":192.0.2.1,此處的__tag__:__client_ip__為Log Service保留欄位,表示日誌所在主機的IP地址。更多資訊,請參見保留欄位

查詢需求

查詢語句

查詢request method欄位值中包含PUT的日誌。欄位名request method中存在空格。

"request method":PUT

查詢採集於192.0.2.1主機的日誌。

"__tag__:__client_ip__":192.0.2.1

在分析語句中

  • 當欄位名、表名等專有名詞中存在特殊字元(空格、中文、:-等)、文法關鍵詞(andor等)等內容時,需要使用""包裹。

  • 表示字串的字元必須使用''(單引號)包裹。無符號包裹或被""(雙引號)包裹的字元表示欄位名或列名。例如:'status'表示字串status,status"status"表示日誌欄位status。

查詢需求

查詢語句

查詢包含192.168.XX.XX的日誌。

* | select * from log where key like '192.168.%.%'

在查詢中使用引號,請參見如何在查詢和分析語句中使用引號?

相關文檔