全部產品
Search
文件中心

Simple Log Service:升級SPL規則文法對照

更新時間:Mar 14, 2026

本文主要介紹資料加工(舊版)和資料加工(新版)規則文法的對比。

Log ServiceSPL語言在資料處理情境下與SQL的使用對照請參考SPL與SQL的使用情境對照

資料同步(無需處理邏輯)

版本

指令碼說明

舊版

資料加工(舊版)DSL指令碼為空白

新版

資料加工(新版)SPL規則為空白

資料篩選與過濾:文本類型精確匹配

版本

指令碼說明

舊版

e_keep(v("level") == "ERROR")或者

e_drop(v("level") != "ERROR")或者

e_if(v("level") != "ERROR", e_drop())或者

e_keep(e_search("level==ERROR"))

新版

| where level='ERROR'

資料篩選與過濾:數實值型別過濾

版本

指令碼說明

舊版

e_keep(ct_int(v("status"))>=400)

新版

| where cast(status as bigint)>=400

資料篩選與過濾:模糊比對

版本

指令碼說明

舊版

e_keep(op_in(v("level"), "ERROR"))或者

e_keep(e_search("level: ERROR")或者

e_if(op_not_in(v("level"), "ERROR"), e_drop())

新版

| where level like '%ERROR%'

新增欄位,比如單個關鍵資訊提取或者構造

版本

指令碼說明

舊版

  1. 正則提取單個資訊。

    e_set("version", regex_select(v("data"), r'"version":\d+'))

  2. JSON提取單個資訊,資料加工(舊版)JSON查詢語言JMES文法

    e_set("version", json_select(v("data"), "version"))

新版

  1. 正則提取單個資訊。

    | extend version=regexp_extract(data, '"version":\d+')

  2. JSON提取單個資訊,資料加工(新版)JSON物件路徑引用JsonPath

    | extend version=json_extract(data, '$.version')

時間資訊解析與格式化

版本

指令碼說明

舊版

  1. 提取日誌時間欄位__time__

    e_set(
        "__time__", 
        dt_parsetimestamp(
            v("time"), 
            fmt="%Y/%m/%d %H-%M-%S",
        ),
    )
  2. 時間格式正常化。

    e_set(
        "time",
        dt_strftime(
            dt_parse(
                v("time"), 
                fmt="%Y/%m/%d %H-%M-%S",
            ), 
            fmt="%Y-%m-%d %H:%M:%S",
        ),
    )

新版

  1. 提取日誌時間欄位__time__

    | extend time=date_parse(time, '%Y/%m/%d %H-%i-%S')

    | extend __time__=cast(to_unixtime(time) as bigint)

  2. 時間格式正常化。

    | extend time=date_parse(time, '%Y/%m/%d %H-%i-%S')

    | extend time=date_format(time, '%Y-%m-%d %H:%i:%S')

欄位處理與篩選

版本

指令碼說明

舊版

  1. 精確選擇欄位。

    e_keep_fields("__tag__:node", "path", regex=False)

  2. 按模式選擇欄位。

    e_keep_fields("__tag__:.*", regex=True)

  3. 原地重新命名部分欄位。

    e_rename("__tag__:node", node)

  4. 按模式排除欄位。

    e_drop_fields("__tag__:.*", regex=True)

新版

  1. 精確選擇欄位。

    | project node="__tag__:node", path

  2. 按模式選擇欄位。

    | project -wildcard "__tag__:*"

  3. 原地重新命名部分欄位。

    | project-rename node="__tag__:node"

  4. 按模式排除欄位。

    | project-away -wildcard "__tag__:*"

正則提取多個欄位

版本

指令碼說明

舊版

e_regex("data", r"(\S+)\s+(\w+)", ["time", "level"])

新版

| parse-regexp data, '(\S+)\s+(\w+)' as time, level

JSON Object索引值資訊展開為資料欄位

版本

指令碼說明

舊版

資料加工(舊版)JSON查詢語言請參見JMES文法

e_json("data", depth=1, jmes="x.y.z")

新版

資料加工(新版)JSON物件路徑引用請參見JsonPath

| parse-json -path='$.x.y.z' data

CSV格式內容提取為資料欄位

版本

指令碼說明

舊版

e_csv("data", ["time", "addr", "user"], sep="\0", quote='"')

新版

  1. 單字元分隔字元請參見CSV RFC 4180

    | parse-csv -delim='\0' -quote='"' data as time, addr, user

  2. 多字元分隔字元。

    | parse-csv -delim='^_^' data AS time, addr, user

邏輯分支處理:平行分支

版本

指令碼說明

舊版

e_if(
    e_has("a"), e_set("mode_a", "1"), 
    e_has("b"), e_set("mode_b", "1"),
)

等價於以下Python代碼結構:

if e_has("a"):
    e_set("mode_a", "1")
if e_has("b"):
    e_set("mode_b", "1")

新版

.let a = *
| where a is not null
| extend mode_a='1';

.let b = *
| where b is not null
| extend mode_b='1';

$a;
$b;

邏輯分支處理:互斥分支if-else/switch

版本

指令碼說明

舊版

e_switch(
    e_has("a"), e_keep_fields("x", "y", "z"), 
    e_has("b"), e_keep_fields("u", "v"),
    default=e_keep_fields("w"),
)

等價於以下Python代碼結構:

if e_has("a"):
    e_keep_fields("x", "y", "z")
elif e_has("b"):
    e_keep_fields("u", "v")
else:
    e_keep_fields("w")

新版

.let src = *
| extend mode=case
    when a is not null then 1
    when b is not null then 2
    else 0
  end;

.let a = $src | where mode=1 | project x, y, z;
.let b = $src | where mode=2 | project u, v;
.let c = $src | where mode=0 | project w;

$a;
$b;
$c;

按照規則動態選擇資料的目標Project/LogStore

版本

指令碼說明

舊版

e_output(project=v("dst_project"), logstore=v("dst_logstore"))

新版

| extend "__tag__:__sls_etl_output_project__"=dst_project

| extend "__tag__:__sls_etl_output_logstore__"=dst_logstore

加工結果指定HashKey路由寫入對應目標Shard

版本

指令碼說明

舊版

e_output(hash_key_field="key_field")

新版

| extend "__tag__:__sls_etl_output_hash_key__"=to_hex(md5(to_utf8(key_field))

打包欄位,Json序列化到新欄位

版本

指令碼說明

舊版

  1. 打包所有欄位。

e_pack_fields("content", include="\w+")

  1. 使用Regex提取欄位dict中的值,並打包賦值給name欄位。

e_regex("dict", r"(\w+):(\d+)", {r"k_\1": r"\2"}, pack_json="name")

新版

  1. 打包所有欄位。

| pack-fields -include='\w+' as content

  1. 使用Regex提取欄位dict中的值,並打包賦值給name欄位。

| parse-kv -prefix='k_' -regexp dict, '(\w+):(\d+)' | pack-fields -include='k_.*' as name

將日誌格式轉化為時序儲存的格式

版本

指令碼說明

舊版

e_to_metric(names="rt", labels="host")

新版

| log-to-metric -names='["rt"]' -labels='["host"]'