查詢語法與功能
日志服務Project支持使用查詢語句對存儲在Logstore中的日志進行篩選。篩選結果可獨立使用,也可以用于分析語句,進行更復雜的分析處理。本文介紹查詢語句的語法結構,以及應用場景和具體示例。
基礎語法
查詢語句和分析語句以|
分割。其格式為:
查詢語句|分析語句
查詢語句可單獨使用,分析語句必須與查詢語句一起使用。即分析功能是基于查詢結果或全量數據進行的。
查詢語句中建議不超過30個條件。
分析語句中無需填寫FROM子句和WHERE子句,默認分析當前Logstore中的數據。分析語句不支持使用offset,不區分大小寫,末尾無需加分號。
語句類型 | 說明 |
查詢語句 | 查詢條件,可以為關鍵詞、數值、數值范圍、空格、星號(*)等。 如果為空格或星號(*),表示無過濾條件。 |
分析語句 | 對查詢結果或全量數據進行計算和統計。日志服務支持的分析函數和語法,請參見: |
查詢和分析語句示例:
* | SELECT status, count(*) AS PV GROUP BY status
本文中涉及的查詢示例的原始日志請參見調試。
查詢語句編寫思路
查詢語句的編寫流程可分為以下三步:
步驟一:確定查詢方式
如需對Logstore中的日志進行查詢,則必須首先創建索引。如需要對某個字段進行分析(SELECT語句),則必須創建字段索引。創建字段索引和全文索引的步驟,請參見字段索引。
不同的索引配置,會產生不同的查詢和分析結果,如果同時創建了全文索引和字段索引,以字段索引的配置為準。
根據索引類型的不同,日志服務Project查詢可分為全文查詢和字段查詢。全文查詢和字段查詢區別如下:
如果只創建全文索引,則只能使用全文查詢。
如果已創建字段索引,則按以下規則查詢:
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
。
步驟二:確定字段類型
編寫查詢語句時需要考慮字段類型的特點,合理使用運算符,快速、精準地鎖定目標日志。
字段類型
字段類型 | 說明 | 可用運算符 |
字符串類型的字段。開啟全文索引后,日志服務默認將整條日志(除 |
| |
只有設置字段的數據類型為long或double后,才能通過數值范圍查詢該字段的值。
|
| |
針對JSON對象中的字段,您可根據其值,將數據類型設置為long、double或text,并開啟統計功能。 | 根據JSON對象中的字段的類型使用不同的運算符。 |
運算符
in運算符只能小寫,其他運算符不區分大小寫。
日志服務保留以下運算符的使用權,如果您需要使用以下運算符作為查詢關鍵字,請使用
""
(雙引號)包裹:sort
、asc
、desc
、group by
、avg
、sum
、min
、max
和limit
。運算符的優先級由高到低排序如下所示:
冒號(:)
雙引號("")
圓括號()
and、not
or
運算符 | 說明 |
| 用于字段查詢(Key:Value),例如 如果字段名稱或者字段值內有空格、冒號(:)、連字符(-)等特殊字符,請使用雙引號("")包裹字段名稱或者字段值,例如 |
|
如果多個關鍵詞之間沒有語法關鍵詞,默認為 |
|
|
|
|
| 用于提高括號內查詢條件的優先級。例如 |
| 使用
|
| 轉義符號,用于轉義 |
| 通配符查詢,匹配零個、單個、多個字符。例如 說明 日志服務會在所有日志中為您查詢到符合條件的100個詞,返回包含這100個詞并滿足查詢條件的所有日志。 |
| 通配符查詢,匹配單個字符。例如 |
| 查詢某字段值大于某數值的日志。例如 |
| 查詢某字段值大于或等于某數值的日志。例如 |
| 查詢某字段值小于某數值的日志。例如 |
| 查詢某字段值小于或等于某數值的日志。例如 |
| 查詢某字段值等于某數值的日志。針對double、long類型的字段, |
| 查詢某字段值處于某數值范圍內的日志,中括號表示閉區間,小括號表示開區間,兩個數字之間使用空格分隔。例如 重要 in只能為小寫字母。 |
| 查詢某個日志源的日志,支持通配符。例如 重要 日志服務中的__source__為保留字段,可縮寫為source。如果您自定義的字段中存在source字段,則會與日志服務保留字段source沖突,此時您需要使用Source、SOURCE等詞查詢自定義的字段。 |
| 通過元數據信息查詢日志。例如 |
| 查詢某日志主題下的日志。例如 |
步驟三:確定匹配模式
您可根據掌握的關鍵詞信息及實際業務場景的需要靈活控制使用精準查詢還是模糊查詢。若無法找到想要的日志,可參見文檔進行排查:查詢不到日志的排查思路。
查詢方式 | 說明 | 示例 |
精確查詢 | 使用完整的詞進行查詢。 日志服務查詢采用的是分詞法,精確查詢時并不能完全匹配關鍵詞。例如查詢語句為 |
|
模糊查詢 | 在查詢語句中指定一個64個字符以內的詞,在詞的中間或者末尾加上模糊查詢關鍵字,即星號(*)或問號(?),日志服務會在所有日志中為您查詢到符合條件的100個詞,返回包含這100個詞并滿足查詢條件的所有日志。指定的詞越精確,查詢結果越精確。 重要
模糊查詢是一種采樣查詢,查詢機制如下所示:
|
更多信息,請參見如何模糊查詢日志?。 |
查詢語句示例
同一條查詢語句,針對不同的日志內容和索引配置時,會有不同的查詢結果。本文基于如下日志樣例和索引介紹查詢語句示例。
日志樣例
本文以Nginx訪問日志為例,介紹常見的查詢語句。
索引配置
在查詢日志前,請確保已配置索引。更多信息,請參見創建索引。檢查索引配置的步驟,如下所示:
在Logstore的查詢/分析頁面,選擇
。在打開的查詢分析頁面,查看是否已配置字段索引。
普通查詢示例
查詢需求 | 查詢語句 | 調試 |
查詢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'
無
基于分詞符的查詢
日志服務會根據分詞符,將日志內容拆分成多個詞。日志服務默認配置的分詞符為
, '";=()[]{}?@&<>/:\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
等)等內容時,需要使用""
包裹。例如"and"
表示查詢包含and的日志,此處的and不代表運算符。日志服務保留以下運算符的使用權,如果您需要使用以下運算符作為查詢關鍵字,請使用
""
包裹:sort
、asc
、desc
、group by
、avg
、sum
、min
、max
和limit
。通過數據加工或者Logtail插件處理的日志,其tag中的key會被轉換成普通key,即查詢時需使用
""
包裹字段名,例如"__tag__:__client_ip__":192.0.2.1
,此處的__tag__:__client_ip__
為日志服務保留字段,表示日志所在主機的IP地址。更多信息,請參見保留字段。
查詢需求
查詢語句
查詢
request method
字段值中包含PUT
的日志。字段名request method
中存在空格。"request method":PUT
查詢采集于
192.0.2.1
主機的日志。"__tag__:__client_ip__":192.0.2.1
在分析語句中
當字段名、表名等專有名詞中存在特殊字符(空格、中文、
:
、-
等)、語法關鍵詞(and
、or
等)等內容時,需要使用""
包裹。表示字符串的字符必須使用
''
(單引號)包裹。無符號包裹或被""
(雙引號)包裹的字符表示字段名或列名。例如:'status'
表示字符串status,status
或"status"
表示日志字段status。
查詢需求
查詢語句
查詢包含
192.168.XX.XX
的日志。* | select * from log where key like '192.168.%.%'
在查詢中使用引號,如何在查詢和分析語句中使用引號?
相關文檔
分析函數和語法,請參見分析函數和語法。
錯誤排查
日志查詢示例
查詢JSON日志(字段值為JSON對象、JSON數組)的查詢和分析的示例,請參見查詢和分析JSON日志和查詢和分析JSON日志的常見問題。