背景
許多用户在日誌查詢方面已經積累了一定的使用習慣,尤其是習慣於使用某些查詢語法進行高效檢索。現在,日誌數據全面接入觀測雲並通過 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"
}
需求分析
用户常見的查詢需求可概括為以下幾步:
- 從日誌中提取特定信息(如 userid:aaaabbdd)
- 對提取出的信息進行數量統計
- 對統計結果進行排序
以往在某些查詢平台中,用户可能會編寫類似以下的語句(語法僅為示意):
_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 語法簡潔卻功能強大,支持用户在不改變原有檢索習慣的基礎上,進一步提升日誌分析效率與靈活性。