全部產品
Search
文件中心

Simple Log Service:加工規則錯誤

更新時間:Jun 30, 2024

本文檔為您介紹資料加工規則錯誤的原因以及排查處理方法。

讀取源Logstore資料成功後,加工引擎開始對源Logstore的日誌事件進行加工。加工規則錯誤

  • 該環節產生錯誤主要是由於在資料加工過程中,全部或者部分日誌事件不適配加工規則,從而引發的邏輯錯誤。

  • 如果加工規則中涉及RDS、Logstore等外聯資源的載入,則也有可能會產生資源的載入或重新整理錯誤。

本文檔主要介紹邏輯錯誤排查方法,資源載入錯誤的排查方法請參見資源載入錯誤

錯誤影響

在日誌事件加工階段,與加工規則衝突的日誌事件會引發報錯,錯誤分成WARNING和ERROR層級(通過加工日誌的logging.levelname體現)。

  • 對於ERROR層級的錯誤, 該日誌事件會丟棄。加工後的輸出結果中將不包含這些日誌事件,並繼續加工其他的日誌事件,不會重試。

  • 對於WARNING層級的錯誤(例如某些事件與正則規則不匹配),會跳過當前DSL的這一步,進行下一步。

錯誤排查方法

  • 查看錯誤記錄檔的logging.levelname欄位,確定日誌的錯誤層級。

  • 查看錯誤記錄檔的message欄位,定位是哪些日誌事件報錯。具體請參見錯誤記錄檔查看方式

  • 查看錯誤記錄檔的reason欄位,確定這些日誌事件的報錯原因。

根據報錯原因,為這些異常日誌事件增添邏輯,可使用e_ife_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引發的錯誤。

  • 解決方案:

    只有日誌事件的欄位b0時才會報錯。因此可以增添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"))))