博客 / 詳情

返回

解鎖DQL高級玩法——對日誌關鍵信息提取和分析

背景

許多用户在日誌查詢方面已經積累了一定的使用習慣,尤其是習慣於使用某些查詢語法進行高效檢索。現在,日誌數據全面接入觀測雲並通過 DataKit 進行採集,用户最關心的問題是:能否通過 DQL 實現以往熟悉的查詢方式,甚至更進一步提升效率?答案是肯定的,DQL 不僅具備高度靈活性,還能提供更強大的日誌處理能力。下面我們通過一個脱敏後的真實案例,逐步演示如何利用 DQL 高效解析和統計日誌。

示例日誌

一行典型的業務日誌(已脱敏):

{
  "timestamp": "2025-06-10 11:09:06.558",
  "level": "INFO",
  "thread": "XXXXXXXXXXXXXXXXXXXXXX6",
  "mdc": {
    "traceId": "f961xxxxd4ab8",
    "spanId": "96b41dxxxxxx5111c",
    "x-st-correlation": "XXXXXXXXXXXXXXXXXX23"
  },
  "message": "User :aaaabbbdd is rate limited",
  "context": "default"
}

需求分析

用户常見的查詢需求可概括為以下幾步:

  1. 從日誌中提取特定信息(如 userid:aaaabbdd)
  2. 對提取出的信息進行數量統計
  3. 對統計結果進行排序

以往在某些查詢平台中,用户可能會編寫類似以下的語句(語法僅為示意):

_index=tier3_app_auth _source=aaa _sourceCategory=prod "is rate limited" | parse "\"message\":\"User :* is rate limited\"" as userId | count by userId | sort by _count desc as you can see the log is "User : is rate limited".

接下來我們將展示如何通過 DQL 實現相同甚至更優的效果。

DQL 實現

為了清晰體現從解析到統計的完整流程,我們分兩步實現:

Step1:提取 userid

通過 DQL 的 regexp_extract() 函數,使用正則表達式從 message 字段中提取 userid:

# explain
 L('日誌索引')::`日誌來源`:(regexp_extract(message,'正則表達式', 1) as m1)
 
# DQL
L('default')::`san1`:(regexp_extract(message,'User :(.*) is rate limited', 1) as m1)

該語句執行後返回提取出的 ml 字段,即 userid。

字段説明 示例值
default 日誌索引(Index)
san1 日誌來源(Source)
message 要解析的字段
1 正則裏第 1 個捕獲組

函數 regexp_extract 中對應參數解釋如下:

非命名參數 描述 類型 是否必填 默認值
字段名稱 查詢的字段 string
正則表達式 包含捕獲組的正則表達式 string
返回的分組 返回的第 n 個分組 int 0(表示匹配整個正則表達式),1(表示匹配正則表達式中第一組,以此類推...)

查詢返回的結果如下(m1列就是日誌原文中提取出來的 uesrid):

圖片

Step2:統計與排序

接下來我們使用嵌套查詢,對上一步提取出的 ml(userid)進行計數和排序:

# datasource 數據來源
# target_clause 指定要查詢的列
# by-clause 分組依據
# sorder-by-clause 排序查詢結果

'''
L::(
    __datasource__
):(
    __target_clause__
) by-clause 
sorder-by-clause
 '''

# DQL結構拆解
'''

L::(
    L('default')::`san1`:(
        regexp_extract(message,'User :(.*) is rate limited', 1) as m1
     )
):(
    count(`m1`) as c1
) by m1 
sorder by c1 desc

'''


# DQL
L::(L('default')::`san1`:(regexp_extract(message,'User :(.*) is rate limited', 1) as m1)):(count(`m1`) as c1) by m1 sorder by c1 desc

執行結果:

  • ml:提取出的 userid
  • c1:該 userid 出現的次數
  • 結果按 c1 降序排列

圖片

總結

通過正則提取 + 嵌套查詢的組合,DQL 能夠高效完成日誌解析、統計和排序等複雜操作。依託觀測雲的高性能日誌處理引擎,即使在大規模數據場景下,查詢仍能秒級返回結果。DQL 語法簡潔卻功能強大,支持用户在不改變原有檢索習慣的基礎上,進一步提升日誌分析效率與靈活性。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.