通過事件判斷可以更好地對符合特定條件的資料進行相應操作,讓加工邏輯更可靠。本文主要介紹使用函數進行事件判斷的常見情境和最佳方案樣本。
情境1:判斷欄位是否存在
原始日誌
a: a_value b: //Null 字元串
SLS DSL編排
方案一(推薦):採用
e_has
或e_not_has
。e_if(e_has("a"),e_set("has_a", true)) e_if(e_has("b"),e_set("has_b", true)) e_if(e_has("c"),e_set("has_c", true)) e_if(e_not_has("a"),e_set("not_has_a", true)) e_if(e_not_has("b"),e_set("not_has_b", true)) e_if(e_not_has("c"),e_set("not_has_c", true))
方案二:採用
e_search
。e_if(e_search('a: *'),e_set("has_a", true)) e_if(e_search('b: *'), e_set("has_b", true)) e_if(e_search('c: *'), e_set("has_c", true)) e_if(e_search('not a: *'), e_set("not_has_a", true)) e_if(e_search('not b: *'), e_set("not_has_b", true)) e_if(e_search('not c: *'), e_set("not_has_c", true))
說明加工規則中的
e_if
可通過e_if(條件1,操作1,條件2,操作2)
的形式合并為一項,此處和本文其他處的拆分是為了方便閱讀。
加工結果
a:a_value b: //Null 字元串 has_a: true has_b: true not_has_c: true
情境2:判斷欄位值是否存在且不為空白
原始日誌
a: a_value b: // Null 字元串
SLS DSL編排
方案一(推薦):採用欄位存取子
v
e_if(v("a"), e_set("not_empty_a", true)) e_if(v("b"), e_set("not_empty_b", true)) e_if(v("c"), e_set("not_empty_c", true))
說明欄位存取子
v
,當對應欄位存在且值不為空白時,其自動轉換的Bool
值為true,否則為false。方案二:採用
e_search
#至少一個字元 e_if(e_search('a: "?"'), e_set("not_empty_a", true)) e_if(e_search('b: "?"'), e_set("not_empty_b", true)) e_if(e_search('c: "?"'), e_set("not_empty_c", true)) #正則 e_if(e_search('a~=".+"'), e_set("not_empty_a", true)) e_if(e_search('b~=".+"'), e_set("not_empty_b", true)) e_if(e_search('c~=".+"'), e_set("not_empty_c", true)) #存在且不為空白 e_if(e_search('a: * and not a==""'), e_set("not_empty_a", true)) e_if(e_search('b: * and not b==""'), e_set("not_empty_b", true)) e_if(e_search('c: * and not c==""'), e_set("not_empty_b", true))
加工結果
a: a_value b: //空串 not_empty_a: true
情境3:判斷欄位值是否存在且為空白
原始日誌
a: a_value b: // Null 字元串
SLS DSL編排
方案一(推薦):採用欄位存取子
v
e_if(op_and(e_has("a"), op_not(v("a"))), e_set("empty_a", true)) e_if(op_and(e_has("b"), op_not(v("b"))), e_set("empty_b", true)) e_if(op_and(e_has("c"), op_not(v("c"))), e_set("empty_c", true)) # 錯誤方案 e_if(op_not(v("a")), e_set("empty_a", true)) e_if(op_not(v("b")), e_set("empty_b", true)) e_if(op_not(v("c")), e_set("empty_c", true))
說明欄位存取子
v
,當對應欄位存在且值不為空白時,其自動轉換的Bool
值為true,否則為false。當值不存在時,其返回true,op_not(None)
時也是返回true。方案二:採用
e_search
e_if(e_search('a==""'), e_set("empty_a", true)) e_if(e_search('b==""'), e_set("empty_b", true)) e_if(e_search('c==""'), e_set("empty_c", true)) # 錯誤調用 e_if(e_search('a:""'), e_set("empty_a", true)) e_if(e_search('b:""'), e_set("empty_b", true))
說明以上錯誤調用中,因函數
e_search
為部分查詢,欄位存在時,無論其值是否空串,空串a: ""
一直為true。
加工結果
a: a_value b: //Null 字元串 empty_b: true
情境4:基於欄位值的邏輯查詢判斷
原始日誌
"日誌1" http_host: example.com status: 200 request_method: GET scheme: https header_length: 700 body_length: 1200 "日誌2" http_host: example.org status: 200 request_method: POST scheme: https header_length: 100 body_length: 800 "日誌3" http_host: example.net status: 200 request_method: GET scheme: http header_length: 700 body_length: 800 "日誌4" http_host: aliyundoc.com status: 404 request_method: GET scheme: https header_length: 100 body_length: 300
加工需求1
為所有
status
欄位值為200的日誌事件,添加一個新欄位type
,其值為normal。SLS DSL編排
e_if(e_match("status", "200"), e_set("type", "normal")) 或 e_if(e_search('status==200'), e_set("type", "normal"))
說明簡單情境下,以上兩種編排均可。
本文情況下可採用
status:200
,表示status是否包含200,但推薦使用status==200
更精確。
加工結果
"日誌1" type: normal http_host: example.com status: 200 request_method: GET scheme: https header_length: 700 body_length: 1200 "日誌2" type: normal http_host: example.org status: 200 request_method: POST scheme: https header_length: 100 body_length: 800 "日誌3" type: normal http_host: example.net status: 200 request_method: GET scheme: http header_length: 700 body_length: 800 "日誌4" http_host: aliyundoc.com status: 404 request_method: GET scheme: https header_length: 100 body_length: 300
加工需求2
為所有
status
欄位值為200,且request_method
欄位值為GET,且scheme
欄位值為https的日誌事件添加一個新欄位type
,其值為normal。SLS DSL編排
e_if(e_search('status==200 and request_method==GET and scheme==https'), e_set("type", "normal")) 或 e_if(e_match_all("status", "200", "request_method", "GET", "scheme", "https"), e_set("type", "normal"))
說明需要同時滿足多個欄位的匹配條件的應用情境中,您可採用
e_search
或e_match_all
,e_search
用法相對簡潔。本文情況可以採用
status: 200
,表示status是否包含200,但推薦使用status==200
更精確。
加工結果
"日誌1" type: normal http_host: example.com status: 200 request_method: GET scheme: https header_length: 700 body_length: 1200 "日誌2" http_host: example.org status: 200 request_method: POST scheme: https header_length: 100 body_length: 800 "日誌3" http_host: example.net status: 200 request_method: GET scheme: http header_length: 700 body_length: 800 "日誌4" http_host: aliyundoc.com status: 404 request_method: GET scheme: https header_length: 100 body_length: 300
加工需求3
為所有
status
欄位值為200,或request_method
欄位值為GET,或scheme
欄位值為https的日誌事件添加一個欄位type
,其值為normal。SLS DSL編排
e_if(e_search('status==200 or request_method==GET or scheme==https'), e_set("type", "normal")) 或者 e_if(e_match_any("status", "200", "request_method", "GET", "scheme", "https"), e_set("type", "normal"))
加工結果
"日誌1" type: normal http_host: example.com status: 200 request_method: GET scheme: https header_length: 700 body_length: 100 "日誌2" type: normal http_host: example.org status: 200 request_method: POST scheme: https header_length: 100 body_length: 800 "日誌3" type: normal http_host: example.net status: 200 request_method: GET scheme: http header_length: 700 body_length: 800 "日誌4" type: normal http_host: aliyundoc.com status: 404 request_method: GET scheme: https header_length: 100 body_length: 1300
加工需求4
為所有
status
欄位值為200,且request_method
欄位值為GET,且header_length
,且body_length
的欄位值之和小於等於1000的日誌事件,添加一個新欄位type
,其值為normal。SLS DSL編排
e_if(op_and(e_search('status: 200 and request_method: GET'), op_le(op_sum(v("header_length"), v("body_length")), 1000)), e_set("type", "normal"))
說明在複雜的邏輯情境下,您可採用
e_search
和其他運算式函數的組合完成SLS DSL編排。加工結果
"日誌1" type: normal http_host: example.com status: 200 request_method: GET scheme: https header_length: 700 body_length: 100 "日誌2" http_host: example.org status: 200 request_method: POST scheme: https header_length: 100 body_length: 800 "日誌3" http_host: example.net status: 200 request_method: GET scheme: http header_length: 700 body_length: 800 "日誌4" http_host: aliyundoc.com status: 404 request_method: GET scheme: https header_length: 100 body_length: 1300