本文檔為您介紹數據加工規則錯誤的原因以及排查處理方法。
讀取源Logstore數據成功后,加工引擎開始對源Logstore的日志事件進行加工。
該環節產生錯誤主要是由于在數據加工過程中,全部或者部分日志事件不適配加工規則,從而引發的邏輯錯誤。
如果加工規則中涉及RDS、Logstore等外聯資源的加載,則也有可能會產生資源的加載或刷新錯誤。
本文檔主要介紹邏輯錯誤排查方法,資源加載錯誤的排查方法請參見資源加載錯誤。
錯誤影響
在日志事件加工階段,與加工規則沖突的日志事件會引發報錯,錯誤分成WARNING和ERROR級別(通過加工日志的logging.levelname體現)。
對于ERROR級別的錯誤, 該日志事件會丟棄。加工后的輸出結果中將不包含這些日志事件,并繼續加工其他的日志事件,不會重試。
對于WARNING級別的錯誤(例如某些事件與正則規則不匹配),會跳過當前DSL的這一步,進行下一步。
錯誤排查方法
查看錯誤日志的
logging.levelname
字段,確定日志的錯誤級別。查看錯誤日志的
message
字段,定位是哪些日志事件報錯。具體請參見錯誤日志查看方式。查看錯誤日志的
reason
字段,確定這些日志事件的報錯原因。
根據報錯原因,為這些異常日志事件增添邏輯,可使用e_if
、e_switch
等流程控制函數,捕獲并處理這些錯誤。
常見錯誤排查
日志事件中存在異常值
除數為0
#部分日志事件字段b的值為0,引發除數為0的錯誤
e_set("c", op_div_floor(v("a"), v("b")))
錯誤日志:
{ "reason": "error when calling : floordiv\nDetail: integer division or modulo by zero", }
排查方法:
檢查報錯的日志事件,確認它們的字段
b
的值是否為0。如果是,此處則是由除數為0引發的錯誤。解決方案:
只有日志事件的字段
b
為0時才會報錯。因此可以增添e_if
邏輯來捕獲b
的字段值為0的異常情況。e_if_else(op_eq(v("b"), "0"), e_set("c", v("a")), e_set("c", op_div_floor(v("a"), v("b")))
不合法的時間戳格式
#部分日志事件的字段a的值不是合法的時間戳格式,引發報錯
e_set("b", dt_fromtimestamp(v("a")))
錯誤日志:
{ "reason": "error when calling : int\nDetail: invalid literal for int() with base 10: '異常值'", }
排查方法:
檢查報錯的日志事件,查看字段
a
的值是否為合法的時間戳格式(數值型字符串)。解決方案:
增加判斷邏輯,如果字段
a
的值不是合法的時間戳格式,則將這條日志事件輸出到target2
中。e_if_else(str_isdigit(v("a"))),e_set("b", dt_fromtimestamp(v("a"))), e_output("target2"))
數值運算前未進行數據類型轉換
加工規則樣例:
e_set("a", 10)
e_set("b", 10)
e_set("c", op_mul(v("a"), v("b")))
錯誤日志:
{ "reason": "error when calling : mul\nDetail: can't mulltiply sequence by non-int of type' str'", }
原因分析:
LOG DSL處理過程中,日志事件中的各個字段值都是以字符串形式存儲。上述規則樣例中,
v("a")
和v("b")
都是字符串類型,直接傳遞給op_mul
會引發報錯。排查方法:
檢查LOG DSL規則,是否在做數值計算前未進行數據類型轉換。
解決方案:
使用
ct_int
函數進行數據類型轉換,將字符串型轉化為整型后,再傳遞給op_mul
函數。e_set("a", 10) e_set("b", 10) e_set("c", op_mul(c_int(v("a")), c_int(v("b"))))