
基本概念
ETL, Data Transformation
ETL (Extract, Transform, Load)是資料分析領域中資料加載、轉換、輸出的的意思,日志服務中主要加載源Logstore與輸出到其他Logstore, 也會加載OSS, RDS, 其他Logstore做資料富化. 但主要是對資料進行Data Transformation的工作.
事件、資料、日志
在資料加工的上下文中, 事件、資料都是表示日志, 例如事件時間就是日志時間,丢棄事件字段函數
drop_event_fields
就是用于丢棄特定日志字段.
日志時間
日志自身的時間, 指日志表示的事件所發生的時間. 也稱事件時間. 在日志中的保留字段為
__time__
,一般由日志中的時間資訊直接提取生成。整型,Unix标準時間格式。機關為秒,表示從1970-1-1 00:00:00 UTC計算起的秒數。
日志接收時間
日志到達伺服器被接收時的時間, 預設不儲存在日志中, 但是如果資料logstore開啟了
記錄外網IP, 會保留在日志标簽字段的
__receive_time__
上, 資料加工中的完整字段名是
__tag__:__receive_time__
. 中, 類型整型,Unix标準時間格式。機關為秒,表示從1970-1-1 00:00:00 UTC計算起的秒數。
注意: 資料加工日志作業的配置項
進階選項
的
時間範圍
, 是以日志接收時間為準的.
日志時間 vs. 日志接收時間
大部分場景下, 日志是實時發送給日志服務的, 是以日志的時間與接收日志的基本相同或者接近. 如果日志不是實時發送的, 日志時間與接收時間會不一緻, 這種情況一般發生在導入曆史時間的情況. 例如通過SDK導入了過去30天的日志. 那麼日志時間就是上個月的, 而日志接收時間就是目前.
日志标簽
日志的标簽TAG,包括:
- 使用者自定義标簽:您通過API PutLogs寫入資料時添加的标簽。
-
系統标簽:服務端為您添加的标簽,包括__client_ip__和__receive_time__。
在資料加工中, 标簽字段以
作為字首.__tag__:
具體參考
日志字段配置相關
源Logstore
資料加工中, 讀取資料的logstore再進行加工的是源logstore. 一個作業隻支援一個源logstore. 但可以對一個源logstore配置多個加工作業.
目标Logstore
資料加工中資料寫入的logstore叫目标logstore. 一個作業可以是一個或者多個. 可以是靜态配置的, 也可以是動态配置的.
LOG DSL
日志服務領域專用語言LOG DSL (Domain Specific Language)是日志服務資料加工使用的編排語言, 一種Python相容的腳本語言. LOG DSL基于Python提供内置200個函數簡化常見資料加工模式. 也支援使用者自由定義的Python擴充(目前僅針對特定客戶開放). 詳情請參考
日志服務DSL加工規則
也叫加工腳本, 是使用ETL語言編排的邏輯代碼集合.
加工作業
由源logstore、目标logstore、加工規則以及其他配置項如加工時間範圍、權限參數等組成的任務, 叫做加工作業. 也是資料加工的最小排程單元.
規則相關
資源
除了資料源的logstore外的, 資料加工中會引用的第三方資料源叫做資源做某種配置或者富化, 包括但不限于本地資源, OSS, 外部Logstore, RDS等.
維表
用于做資料富化的資料某些次元資訊的外部表格叫做維表. 例如公司使用者賬戶清單, 産品清單, 地理位置資訊庫等. 維表可能會動态更新, 維表一般存在于資源中.
富化、映射
日志包含的資訊不全時, 需要借助外部資訊進行完善. 對日志一個或多個字段通過映射完善出更多資訊的過程叫做富化或者映射.
例如某個請求包含HTTP狀态碼
status
, 可以通過如下表格富化出新字段HTTP狀态描述
status_desc
:
status | status_desc |
---|---|
200 | 成功 |
300 | 跳轉 |
400 | 權限錯誤 |
500 | 伺服器錯誤 |
或者源資料中有
user_id
字段, 使用外部賬戶維表, 映射出其對應使用者名、性别、注冊時間、郵箱等資訊放入到事件字段中并寫入目标logstore中。
分裂
日志資訊非常複雜, 同時包含了多條資訊時, 對一條日志分裂成多條日志時的過程叫做事件分裂.
例如某一條日志的字段
content
内容如下:
__time__: 1231245
__topic: "win_logon_log"
content:
[ {
"source": "1.2.3.4",
"dest": "1.2.3.4"
"action": "login",
"result": "pass"
},{
"source": "1.2.3.5",
"dest": "1.2.3.4"
"action": "logout",
"result": "pass"
}
]
可以分裂成2條日志:
__time__: 1231245
__topic: "win_logon_log"
content:
{
"source": "1.2.3.4",
"dest": "1.2.3.4"
"action": "login",
"result": "pass"
}
和
__time__: 1231245
__topic: "win_logon_log"
content:
{
"source": "1.2.3.5",
"dest": "1.2.3.4"
"action": "logout",
"result": "pass"
}
GROK
使用模式化文法代替複雜的正規表達式.
例如
grok("%{IPV4}")
表示一個比對IP v4的正規表達式,等價于:
"(?<![0-9])(?:(?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5])[.](?:[0-1]?[0-9]{1,2}|2[0-4][0-9]|25[0-5]))(?![0-9])"
GROK參考 正則捕獲
用于特定正規表達式中局部内容捕獲并給與一個名字, 資料加工中主要用于傳遞給
e_regex
中更直覺的配置提取的字段名.
e_regex("content", "(?P<email>[a-zA-Z][a-zA-Z0-9_.+-=:]+@\w+\.com")
表示提取字段
content
中的郵件位址并放入到字段
email
中. 這裡郵件是一個通用正規表達式, 推薦使用GROK進行簡化:
e_regex("content", grok("%{EMAILADDRESS:email}")
.
進一步詳情,請參考使用者手冊。
進一步參考
歡迎掃碼加入官方釘釘群獲得實時更新與阿裡雲工程師的及時直接的支援: