云日志服務提供一套查詢分析語句,由查詢條件與SQL語句組成,兩者通過管道符豎線 | 分割。
- 查詢條件:通過查詢條件指定日志內容需要匹配的條件,返回符合該條件的日志。例如使用 'status:404' 查詢響應狀態碼為404的日志。檢索條件為空代表無檢索條件,即所有日志均可被查詢出來。
- SQL語句:通過SQL語句可針對符合檢索條件的日志進行統計分析,返回統計分析結果。例如使用以下查詢分析語句,統計響應狀態碼為404的日志數量。
status:404 | select count(*) as num
本文主要介紹查詢語句語法,SQL語法與使用說明請查看SQL語法。若您只需要查詢日志,不需要進行統計分析,則可省略其中的管道符及SQL語句。
查詢方式
根據索引配置方式可分為全文搜索和字段搜索,根據搜索精確程度可分為精確搜索和模糊搜索。
以下為云日志服務提供的各種查詢方式介紹以及查詢語句示例。
全文查詢
-
前提條件:配置索引時開啟了全文索引,詳情請查看索引配置。
-
語法說明:日志單元配置全文索引后,日志服務將原始日志拆分成多個關鍵詞。您可直接輸入關鍵詞進行檢索。
keyword1 [ [ and | or | not ] keyword2 ] ... -
使用示例:以下示例均為搜索原文中同時包含ERROR和INFO關鍵詞的日志
ERROR INFOERROR and INFO
注意
__message__為日志原文對應的內置字段,查詢語句ERROR等同于__message__:ERROR,默認匹配日志原文的內容。
多個關鍵詞默認通過AND連接,查詢語句ERROR INFO等同于ERROR and INFO。
字段查詢
-
前提條件:配置索引時開啟了字段索引,詳情請查看索引配置。
-
語法說明:日志單元配置字段索引后,您可以指定字段名和字段值(key = value)進行搜索。根據字段索引中設置的數據類型,您可以進行多種類型的基礎搜索和組合搜索。
keyname1 [ : | > | >= | < | <= | = | in ] value1 [ [ and | or | not ] keyname2 ... ] -
使用示例:
- 檢索字段 level 為ERROR的日志:
level: ERROR- 檢索字段 latency(索引類型為double)大于100的日志:
latency > 100- 檢索字段 host為 test且 latency大于100的日志:
host: test and latency > 100
注意
value參數不可為空,您可通過查詢語句key:""匹配字段值為空的日志。
字段查詢和 not 運算符配合使用時,還會匹配到不包含該字段的日志。
精確查詢
-
前提條件:配置索引時開啟了字段索引或全文索引,詳情請查看索引配置。
-
使用說明:使用精確的詞進行搜索。
-
使用示例
- 搜索字段 level為ERROR的日志:
level: ERROR - 搜索原文中同時包含ERROR和INFO關鍵詞的日志
ERROR and INFO
- 搜索字段 level為ERROR的日志:
模糊查詢
-
前提條件:配置索引時開啟了字段索引或全文索引,詳情請查看索引配置。
-
使用說明:在搜索查詢語句中指定一個詞,在詞的中間或者末尾加上模糊搜索關鍵字,星號(*)或問號(?),云日志服務會在所有日志中搜索到符合條件的詞,返回包含這些詞并滿足搜索條件的所有日志。
-
使用示例:
- 在所有日志中查找以GE開頭的詞,并返回包含這些詞的日志
GE* - 在所有日志中查找request_method字段值以GE開頭的詞,并返回包含這些詞的日志
request_method:GE*
- 在所有日志中查找以GE開頭的詞,并返回包含這些詞的日志
注意
星號(*)代表匹配多個字符,問號(?)代表匹配1個字符。
星號(*)或問號(?)不能用在詞的開頭。
double數據類型不支持使用星號(*)或問號(?)進行模糊搜索。
運算符
查詢語句支持以下運算符:
| 運算符 | 說明 | 示例 |
|---|---|---|
| : | 用于字段檢索(key:value); 如果字段值value內有空格、冒號(:)、連字符(-)等特殊字符,請使用引號(""或'')包裹字段值。 |
status: 404; msg: "no such file" |
| and | 與運算符,不區分大小寫。如果多個關鍵詞之間沒有語法關鍵詞,則默認為and關系。 | abc:123 and bcd:456 |
| or | 或運算符,不區分大小寫。 | abc:123 or abc:456 |
| not | 非運算符,區分大小寫。not 作為運算符使用時需要使用空格分隔。not 運算符和字段搜索配合使用時還會匹配到不包含對應字段的日志。 | not abc:123 |
| "" | 可使用雙引號("")將該語法關鍵詞轉換成普通字符。如msg:"or"表示檢索包含or的日志,此處的or不代表運算符。 | msg:"or" |
| ( ) | 邏輯分組操作符,控制邏輯運算優先級。 | (abc = 123 or abc = 456) and status = 200 |
| \ | 轉義符號,轉義后的字符表示符號本身,被檢索的值包含雙引號("")、冒號(:)時,需進行轉義。 | 如日志內容為 name:lb"0x1F",可輸入關鍵詞?name\:lb\"0x1F\" |
| > | 范圍操作符,表示大于某個數值,僅適用于double類型的字段。 | abc > 123 |
| >= | 范圍操作符,表示大于等于某個數值,僅適用于double類型的字段。 | abc >= 123 |
| < | 范圍操作符,表示小于某個數值,僅適用于double類型的字段。 | abc < 123 |
| <= | 范圍操作符,表示小于等于某個數值,僅適用于double類型的字段。 | abc <= 123 |
| = | 范圍操作符,表示等于某個數值,僅適用于double類型的字段。針對double類型的字段,等號(=)和冒號(:)作用相同。 | abc = 123 |
| in | 檢索某字段值處于某數值范圍內的日志,中括號表示閉區間,圓括號表示開區間,兩個數字之間使用空格分隔。僅適用于double類型的字段。 | latency in (5 100] |
查詢語句示例
以下為常用查詢語句示例
普通查詢示例
| 查詢需求 | 語句 |
|---|---|
| 搜索POST請求且狀態碼為200的日志。 | request_method:POST and status = 200 |
| 搜索GET請求或POST請求成功(狀態碼為200~299)的日志。 | (request_method:POST or request_method:GET) and status in [200 299] |
| 搜索GET請求或POST請求失敗(狀態碼不為200~299)的日志。 | (request_method:POST?or request_method:GET) and not status in [200 299] |
| 搜索非GET請求的日志。 | not request_method:GET |
| 搜索GET請求成功且請求時間小于60秒的日志。 | request_method:GET?and request_time < 60 |
| 搜索請求時間為60秒的日志。 | request_time = 60 |
| 搜索請求時間大于等于60秒,并且小于300秒的日志。 | request_time >= 60 and request_time < 300 或?request_time in [60 300) |
| 搜索全文包含and的日志。 | "and" |
| 搜索user字段值為空的日志。 | user:"" |
進階模糊查詢示例
| 查詢需求 | 查詢語句 |
|---|---|
| 搜索包含以POS開頭的詞的日志。 | POS* |
| 搜索包含以POS開頭,結尾只有一個字符的詞的日志。 | POS? |
| 搜索request_method字段值以POS開頭的日志。 | request_method:POS* |
| 搜索request_method字段值以P開頭,以T結尾,中間還有單個字符的詞的日志。 | request_method:P?T |
| 搜索request_method字段值包含以P開頭,以T結尾,中間包含零個、單個或多個字符的詞的日志。 | request_method:P*T |