天天看點

日志服務資料加工最佳實踐: 使用搜尋映射做進階資料富化進一步參考

日志服務資料加工最佳實踐: 使用搜尋映射做進階資料富化進一步參考

普通映射 vs 搜尋映射

典型映射方式不能滿足富化需求時, 可以使用搜尋映射, 搜尋映射與傳統方式映射的差別在于比對方式不同.

普通映射方式

一般映射使用文本完全比對方式來映射, 例如NGNIX日志中, 需要将狀态碼轉換為一個文本表示:

狀态碼 文本
200 成功
300 跳轉
400 請求錯誤
500 伺服器錯誤

下面規則調用

e_dict_map

将字段

status

中的http請求狀态碼轉化為文本描述, 放入字段

status_desc

.

e_dict_map({"400": "請求錯誤", "500": "伺服器錯誤", "300": "跳轉", "200": "成功"}, "status", "status_desc")           

實際上, NGNIX的HTTP請求的狀态是不止上述4種, 當

status

值是401, 404時, 需要更新字典覆寫, 否則會比對不上. 參考

Http請求狀态碼

搜尋映射方式

當需要一些靈活的針對特定值做比對邏輯時的映射, 例如:

1XX-2XX
3XX
4XX
5XX

就需要使用搜尋映射來實作, 這裡的字典的關鍵字實際是一個

搜尋查詢字元串

status<=299

status: [300, 399]

status: [400, 499]

status: [500, 599]

使用如下代碼:

e_search_dict_map({"status: [400, 499]": "請求錯誤", "status: [500, 599]": "伺服器錯誤", "status: [300, 399]": "跳轉", "status<=200": "成功"}, "status", "status_desc")           

場景樣例1:使用搜尋映射字典做複雜富化

這裡以網絡請求日志來距離做一個更複雜邏輯的映射:

需求

原始日志

"日志1"
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822           

加工需求

根據日志事件的

http_status

body_bytes_sent

的值的不同,為每個事件添加不同的

type

資訊。

  • http_status

    2XX

    并且

    body_bytes_sent

    長度小于1000的日志事件設定

    type

    正常

  • http_status

    2XX

    body_bytes_sent

    長度大于等于1000的日志事件設定

    type

    過長警告

  • http_status

    3XX

    的日志事件設定

    type

    重定向

  • http_status

    4XX

    type

    錯誤

  • 其他的日志事件設定

    type

    其他

LOG DSL編排

e_search_dict_map({'http_status~="2\d+" and body_bytes_sent < 1000': "正常", 'http_status~="2\d+" and body_bytes_sent >= 1000': "過長警告", 'http_status~="3\d+"': "重定向", 'http_status~="4\d+"': "錯誤",  "*": "其他"}, "http_status", "type")           

加工後的日志

"日志1"
type: 正常
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
type: 過長警告
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
type: 錯誤
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
type: 其他
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822           

說明

  • 上面使用了函數

    e_search_dict_map

    ,具體文法參照 e_search_dict_map函數 . 其中映射的關鍵字字段是 ,可支援正則,完全比對,模糊比對等形式。
  • 和基于表格來進行資料富化一樣,基于字典的富化,除了可以使用通過

    {}

    直接建構的字典之外,也可以基于任務配置資源、外部OSS資源、表格資源等來建構字典,具體可參考 字典建構

場景樣例2:使用搜尋表格做資料富化

"日志1"
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822           

針對資料中的

http_status

,

body_bytes_sent

等字段, 映射出其他多個字段例如

type

warning_level

warning_email

等. 具體的規則樣例存儲于RDS-MySQL中, 例如:

MYSQL 資料庫表中資料

content type warning_level warning_email
http_status~="2d+" and body_bytes_sent < 1000 正常 INFO [email protected]
http_status~="2d+" and body_bytes_sent >= 1000 過長警告 WARNING [email protected]
http_status~="3d+" 重定向 [email protected]
http_status~="4d+" 錯誤 ERROR [email protected]

e_search_table_map(res_rds_mysql("...連接配接MySQL參數..."),"content",["type", "warning_level", "warning_email"])           

使用了e_search_table_map 文法,詳細請參照

e_search_table_map

搜尋表格文法,此處簡單講解,res_rds_mysql()裡面填入的是去 RDS MYSQl 拉取資料的配置,該函數會拉取指定的mysql表格,具體文法請見

res_rds_mysql

函數用法,"content"字段指定的是mysql表中的字段,會使用該字段的值的内容去比對原始日志中的内容,具體比對規則請見

e_search

用法,可支援正則,完全比對,模糊比對等形式。

加工後日志

http_status

body_bytes_sent

的值的不同,為每個事件添加不同的type, warning_level以及warning_email資訊。

"日志1"
type: 正常
warning_level: INFO
warning_email: [email protected]
http_host:  m1.abcd.com
http_status:  200
request_method:  GET
body_bytes_sent: 740

"日志2"
type: 過長警告
warning_level: WARNING
warning_email: [email protected]
http_host:  m2.abcd.com
http_status:  200
request_method:  POST
body_bytes_sent: 1123

"日志3"
type: 錯誤
warning_level: ERROR
warning_email: [email protected]
http_host:  m3.abcd.com
http_status:  404
request_method:  GET
body_bytes_sent: 711

"日志4"
type: 其他
warning_level: INFO
warning_email: [email protected]
http_host:  m4.abcd.com
http_status:  504
request_method:  GET
body_bytes_sent: 1822           
  • 以上加工規則預設比對到表中一行之後,立即傳回。可以為

    e_search_table_map

    設定參數 multi_match=True和multi_join=",",分别表示開啟多行比對和比對到多個值時候,多值使用逗号進行組合。
e_search_table_map(res_rds_mysql("...連接配接MySQL參數..."),"content",["type", "warning_level", "warning_email"], multi_match=True,multi_join=",")           
  • 以上加工規則預設使用表格中的列名作為添加的字段名稱,也可以修改為新的字段名稱。例如

    warning_email

    字段重命名為

    email

    字段,把新字段和原字段寫在一個原組裡面即可,如下示例
e_search_table_map(res_rds_mysql("...連接配接MySQL參數..."),"content",["type", "warning_level", ("warning_email", "email")],multi_match=True,multi_join=",")           

  • e_search_table_map

    e_search_table_map函數
  • 基于表格的富化,建構表格方式除了RDS-MySQl外, 還有其他方法, 例如動态建構, 本地資源, OSS等, 具體可參考 表格建構

進一步參考

歡迎掃碼加入官方釘釘群獲得實時更新與阿裡雲工程師的及時直接的支援:

日志服務資料加工最佳實踐: 使用搜尋映射做進階資料富化進一步參考

繼續閱讀