全部產品
Search
文件中心

Simple Log Service:文法簡介

更新時間:Jun 30, 2024

SLS DSL基於Python語言開發,提供兩百多個內建函數來簡化資料加工任務。本文介紹DSL的語言模式、分類和運行原理等。

語言模式

SLS DSL相容Python,標準模式下,SLS DSL可視為Python的子集。除基本的資料結構與表達方式外,文法規則是以函數方式進行編排。如果您有特定UDF的需求,請提交工單
類別Python文法標準模式
資料結構數字、字串、布爾支援。

不支援"""形式字串。

元組、列表、集合、字典支援。

不支援集合set{1,2,3}

對象僅支援內建擴充資料結構,如表格、日期時間對象等。
基本文法操作符,如加減乘除等支援比較子(==、!=、>等)和邏輯運算子(and、or、not),其餘不直接支援,需要通過函數支援。
注釋支援。
變數定義賦值不支援,需使用函數調用傳遞。
條件支援。例如e_if、e_if_else、e_switch函數。
迴圈不直接支援,可通過內建函數嵌套實現。例如如下遍曆數組:
e_if(op_ge(op_len(json_parse(v("x"))), 1), e_set("x0", lst_get(v("x"), 0)))
e_if(op_ge(op_len(json_parse(v("x"))), 2), e_set("x1", lst_get(v("x"), 1)))
函數標準Python內建函數不支援。使用200+內建函數。
函數調用支援。解包調用不支援。
自訂函數def或lambda不支援,提供兩百多個全域操作函數與運算式函數,且支援基於現有函數的自由組合調用。
模組匯入與使用Python標準庫不支援。
線程與進程建立不支援。
匯入第三方庫不支援。
外部網路連接或命令調用支援內建的資源連接器。

函數分類

標準模式的SLS DSL是通過調用函數的方式完成的,其內建兩百多個函數,主要分為兩類:
  • 全域操作函數

    主要用來接收日誌,處理並返回日誌的函數。且只有全域操作函數才能構建加工規則的每個步驟。

  • 運算式函數

    通用型函數,接受特定參數,組合調用後作為參數傳遞給全域操作函數以定義更加靈活的邏輯。

兩類函數功能對比:
函數類型全域步驟接收返回修改日誌組合調用
全域操作函數支援自動接收日誌0到多條日誌 支援大部分情況支援
運算式函數不支援除個別函數支援,大部分不直接處理日誌。特定資料結構不支援支援

全域操作函數

接受日誌並返回日誌的函數。
說明 除全域函數外,其他內建函數不能放在每個步驟的第一行。
一個SLS DSL規則的形式如下:
全域函數1(..參數....)
全域函數2(..參數....)
全域函數3(..參數....)
全域函數4(..參數....)
全域操作函數可以分為兩類:
函數分類描述範例
流程式控制制函數用於步驟流程式控制制,接收日誌,基於條件控制調用其他日誌函數完成Tlog。e_ife_switche_if_else等。
事件處理函數對日誌進行加工的函數 。返回0到多條日誌。 函數範例如下:
  • e_drop_fields丟棄日誌欄位。
  • e_kv提取並添加日誌的索引值對。
  • e_dict_map給日誌做富化。
加工邏輯:
  • 基本處理:
    資料加工會以流式方式讀取源Logstore的資料,並將每一條日誌以字典的資料結構傳遞給加工規則,然後根據加工規則中定義的日誌函數順序處理日誌資料,並將最終的資料加工結果輸出到目標Logstore。
    說明 在傳遞的過程中日誌的欄位和值始終都是字串形式。例如:原日誌是{"__time__": "1234567", "__topic__": "", "k1": "test"},函數e_set("f1", 200)設定欄位f1的值為200,經過這個函數處理後,原日誌會變成:{"__time__": "1234567", "__topic__": "", "k1": "test", "f1": "200"},其中f1200都是字串類型。

    規則中定義的每個日誌函數會順序執行,每個函數會對每個日誌進行處理和修改,最後返回修改後的日誌。

    例如e_set("type", "test")會對每個日誌添加一個欄位type,值為test,下一個函數接收到的就是修改後的日誌。

  • 條件判斷:
    • 條件判斷e_if:某些日誌可以增加條件判斷,不滿足條件的日誌就會跳過本次操作,相當於一個if的邏輯。

      例如e_if(e_match("status", "200"), e_regex("data", "ret: \d+", "result")),會首先判斷欄位status是否為200,如果條件判斷為真,則會對欄位data用Regex提取出新欄位result;如果條件判斷為否,則不會執行任何操作。

    • e_if_else:與if_else操作類似。
  • 停止處理:
    • 某些步驟可能返回0個日誌,表示刪除日誌。

      例如e_if(str_islower(v("result")), e_drop()),如果每個result欄位的值是小寫字串,則丟棄這條日誌,後續的操作將不再進行,自動重新開始下一條日誌。

    • 輸出日誌可以視為一種特殊的停止處理,例如e_output提前輸出日誌到目標並刪除日誌,其後續的操作也不會再進行。
      說明 函數e_coutput會複製一份當前的日誌輸出,並繼續處理後續。
  • 分裂並行:

    某些步驟也可能返回多個日誌,表示分裂日誌。

    例如e_split(data),表示根據欄位data的值將原本的一條日誌分裂成兩條日誌。假如data的值是"abc, xyz",則分裂後兩條日誌欄位data的值分別是abcxyz

    分裂後的每條日誌都會繼續進行後續的步驟。

運算式函數

除了全域操作函數外,SLS DSL還提供200個運算式函數,接收特定參數,返回特定的值,一般是單個運算式函數或其調用組合。形式如下:
全域操作1(運算式函數1(...), ....)
全域操作2(..., 運算式函數2(...), 運算式函數3(...),...)
運算式函數大概可以分為四類:
函數分類描述範例
事件檢查函數接收日誌,提取或檢索返回特定資訊的函數,不會修改傳遞的日誌。函數v返回日誌欄位的值。函數e_searche_match返回日誌是否符合特定的條件。
資源函數串連本地或外部資源,接收特定參數配置並返回資料,一般是字典、表格等類型。 OSS、RDS、Logstore資源函數。
控制函數用於運算式的邏輯操作,接收特定參數並基於條件做控制,調用其他運算式函數返回結果。op_andop_orop_notop_ifop_coalesce等。
其他運算式函數接受固定或者其他函數的調用結果,返回特定的值。字串、時間、類型轉換函式等。