全部產品
Search
文件中心

Simple Log Service:寫入處理器使用情境

更新時間:Nov 25, 2025

寫入處理器可在日誌資料寫入Logstore前對資料進行處理,例如欄位修改,欄位解析,資料過濾和資料脫敏。本文介紹寫入處理器的配置方法,以及使用情境樣本。

前提條件

已建立Project、標準型Logstore並完成日誌採集配置。具體操作,請參見管理Project建立基礎Logstore資料擷取概述

使用情境

假如要從原始日誌中截取三個欄位:request_methodrequest_uristatus。您可按照以下步驟操作。

原始日誌

body_bytes_sent: 22646
host: www.example.com
http_protocol: HTTP/1.1
remote_addr: 192.168.31.1
remote_user: Elisa
request_length: 42450
request_method: GET
request_time: 675
request_uri: /index.html
status: 200
time_local: 2024-12-04T13:47:54+08:00

操作步驟

  1. 建立寫入處理器

    1. 登入Log Service控制台

    2. 在Project列表地區,單擊目標Project。

    3. 在左側導覽列選擇資源 > 資料處理器

    4. 寫入處理器頁簽,單擊建立。配置完成後單擊儲存。參數說明如下。

      參數

      說明

      處理器名稱

      輸入處理器的名稱,例如nginx-logs-text

      SPL

      輸入SPL語句。例如:

      * | project request_method, request_uri, status

      更多資訊,請參見SPL指令與函數

      處理失敗

      SPL處理失敗後的行為,支援:

      • 保留未經處理資料

      • 丟棄未經處理資料

      說明
      • 這裡處理失敗僅指SPL執行失敗,例如資料不合法導致運算元執行異常。不包含SPL語法錯誤的情境。

      • 如果SPL文法配置錯誤導致解析失敗,預設會保留未經處理資料。

  2. 將寫入處理器應用到Logstore。

    1. 在目標Project頁面,在左側導覽列單擊日誌儲存,然後將滑鼠懸浮在目標Logstore上,單擊修改

    2. Logstore屬性頁面,選擇寫入處理器,單擊修改,選擇需要關聯的寫入處理器,然後單擊儲存

      說明

      關聯寫入處理器,僅對增量日誌生效,生效時間1分鐘左右。

更多使用情境樣本

  • 欄位修改

    通過projectproject-awayproject-renameextend等 SPL 指令可以對資料的欄位進行增刪改處理。例如原始日誌為:

    body_bytes_sent: 22646
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.31.1
    remote_user: Elisa
    request_length: 42450
    request_method: PUT
    request_time: 675
    request_uri: /request/path-1/file-6?query=123456
    status: 200
    time_local: 2024-12-04T13:47:54+08:00

    使用情境

    需求描述

    SPL語句

    結果

    保留特定欄位

    僅保留如下三個欄位:

    • request_method

    • request_uri

    • status

    * | project request_method, request_uri, status
    request_method: PUT
    request_uri: /request/path-1/file-6?query=123456
    status: 200

    僅保留如下三個欄位,且需要對結果欄位重新命名:

    • request_method重新命名為method

    • request_uri重新命名為uri

    • status

    * | project method=request_method, uri=request_uri, status
    method: PUT
    uri: /request/path-1/file-6?query=123456
    status: 200

    保留所有request_開頭的欄位。

    * | project -wildcard "request_*"
    request_length: 42450
    request_method: PUT
    request_time: 675
    request_uri: /request/path-1/file-6?query=123456

    刪除特定欄位

    刪除如下欄位:

    • http_protocol

    • referer

    • remote_addr

    • remote_user

    * | project-away http_protocol, referer, remote_addr, remote_user
    body_bytes_sent: 22646
    host: www.example.com
    request_length: 42450
    request_method: PUT
    request_time: 675
    request_uri: /request/path-1/file-6?query=123456
    status: 200
    time_local: 2024-12-04T13:47:54+08:00

    刪除所有request_開頭的欄位。

    * | project-away -wildcard "request_*"
    body_bytes_sent: 22646
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.31.1
    remote_user: Elisa
    status: 200
    time_local: 2024-12-04T13:47:54+08:00

    新增欄位

    新增app欄位,值固定為test-app

    * | extend app='test-app'
    app: test-app
    body_bytes_sent: 22646
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.31.1
    remote_user: Elisa
    request_length: 42450
    request_method: PUT
    request_time: 675
    request_uri: /request/path-1/file-6?query=123456
    status: 200
    time_local: 2024-12-04T13:47:54+08:00

    新增request_query欄位,值需要從request_uri中進行提取。

    * | extend request_query=url_extract_query(request_uri)
    body_bytes_sent: 22646
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.31.1
    remote_user: Elisa
    request_length: 42450
    request_method: PUT
    request_query: query=123456
    request_time: 675
    request_uri: /request/path-1/file-6?query=123456
    status: 200
    time_local: 2024-12-04T13:47:54+08:00

    修改欄位名

    time_local重新命名為time

    * | project-rename time=time_local
    body_bytes_sent: 22646
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.31.1
    remote_user: Elisa
    request_length: 42450
    request_method: PUT
    request_time: 675
    request_uri: /request/path-1/file-6?query=123456
    status: 200
    time: 2024-12-04T13:47:54+08:00

    修改欄位值

    request_uri欄位進行處理,僅保留路徑部分,丟掉參數部分。

    * | extend request_uri=url_extract_path(request_uri)

    或者

    * | extend request_uri=regexp_replace(request_uri, '\?.*', '')
    body_bytes_sent: 22646
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.31.1
    remote_user: Elisa
    request_length: 42450
    request_method: PUT
    request_time: 675
    request_uri: /request/path-1/file-6
    status: 200
    time_local: 2024-12-04T13:47:54+08:00
  • 欄位解析

    通過parse-regexpparse-jsonparse-csv等 SPL 指令,以及 SQL 中的正則、JSON 等處理函數,可以實現對資料的欄位解析和提取。

    使用情境

    未經處理資料

    需求描述

    SPL語句

    結果

    正則解析

    content: 192.168.1.75 - David [2024-07-31T14:27:24+08:00] "PUT /request/path-0/file-8 HTTP/1.1" 819 21577 403 73895 www.example.com www.example.com "Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1"

    通過Regex對 Nginx 訪問日誌進列欄位提取,並丟棄原來的content欄位。

    * 
    | parse-regexp content, '(\S+)\s-\s(\S+)\s\[(\S+)\]\s"(\S+)\s(\S+)\s(\S+)"\s(\d+)\s(\d+)\s(\d+)\s(\d+)\s(\S+)\s(\S+)\s"(.*)"' as remote_addr, remote_user, time_local, request_method, request_uri, http_protocol, request_time, request_length, status, body_bytes_sent, host, referer, user_agent
    | project-away content
    body_bytes_sent: 73895
    host: www.example.com
    http_protocol: HTTP/1.1
    referer: www.example.com
    remote_addr: 192.168.1.75
    remote_user: David
    request_length: 21577
    request_method: PUT
    request_time: 819
    request_uri: /request/path-0/file-8
    status: 403
    time_local: 2024-07-31T14:27:24+08:00
    user_agent: Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1
    request_method: PUT
    request_uri: /request/path-0/file-8
    status: 200

    request_uri欄位中提取出file-8部分,並命名為file欄位。

    * | extend file=regexp_extract(request_uri, 'file-.*')

    file: file-8
    request_method: PUT
    request_uri: /request/path-0/file-8
    status: 200

    JSON解析

    headers: {"Authorization": "bearer xxxxx", "X-Request-ID": "29bbe977-9a62-4e4a-b2f4-5cf7b65d508f"}

    headers欄位進行 JSON 解析,並丟棄原來的headers欄位。

    *
    | parse-json headers
    | project-away headers

    Autorization: bearer xxxxx
    X-Request-ID: 29bbe977-9a62-4e4a-b2f4-5cf7b65d508f

    headers中提取部分欄位,例如提取出Authorization欄位,並命名為token

    * | extend token=json_extract_scalar(headers, 'Authorization')

    headers: {"Authorization": "bearer xxxxx", "X-Request-ID": "29bbe977-9a62-4e4a-b2f4-5cf7b65d508f"}
    token: bearer xxxxx

    request: {"body": {"user_id": 12345, "user_name": "Alice"}}

    request欄位中的body子欄位進行JSON解析。

    * | parse-json -path='$.body' request
    request: {"body": {"user_id": 12345, "user_name": "Alice"}}
    user_id: 12345
    user_name: Alice

    分隔字元解析

    content: 192.168.0.100,"10/Jun/2019:11:32:16,127 +0800",www.example.com

    按照逗號將欄位進行分割,並丟棄原來的content欄位。

    *
    | parse-csv -quote='"' content as ip, time, host
    | project-away content
    host: www.example.com
    ip: 192.168.0.100
    time: 10/Jun/2019:11:32:16,127 +0800
    content: 192.168.0.100||10/Jun/2019:11:32:16,127 +0800||www.example.com

    使用||作為分隔字元,將欄位進行分割,並丟棄原來的content欄位。

    *
    | parse-csv -delim='||' content as ip, time, host
    | project-away content
    host: www.example.com
    ip: 192.168.0.100
    time: 10/Jun/2019:11:32:16,127 +0800

  • 資料過濾

    通過where指令可以對資料進行過濾。

    需要特別注意的是,在SPL處理過程中,會預設將所有原始欄位當做文本來進行處理,因此如果需要進行數值操作,應當先通過類型轉換函式函數進行類型轉換。

    未經處理資料

    需求描述

    SPL語句

    結果

    request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919
    status: 200
    
    ---
    
    request_id: 7f9dad20-bc57-4aa7-af0e-436621f1f51d
    status: 500

    僅保留status200的資料。

    * | where status='200'

    或者

    * | where cast(status as bigint)=200
    request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919
    status: 200
    request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919
    status: 200
    
    ---
    
    request_id: 7f9dad20-bc57-4aa7-af0e-436621f1f51d
    status: 500
    error: something wrong

    僅保留不存在error欄位的資料。

    * | where error is null
    request_id: ddbde824-7c3e-4ff1-a6d1-c3a53fd4a919
    status: 200

    僅保留存在error欄位的資料。

    * | where error is not null
    request_id: 7f9dad20-bc57-4aa7-af0e-436621f1f51d
    status: 500
    error: something wrong
    method: POST
    request_uri: /app/login
    
    ---
    
    method: GET
    request_uri: /user/1/profile
    status: 404
    
    ---
    
    method: GET
    request_uri: /user/2/profile
    status: 200

    僅保留request_uri/user/開頭的資料。

    * | where regexp_like(request_uri, '^\/user\/')
    method: GET
    request_uri: /user/1/profile
    status: 404
    
    ---
    
    method: GET
    request_uri: /user/2/profile
    status: 200

    保留request_uri/user/開頭,且status200的資料。

    * | where regexp_like(request_uri, '^\/user\/') and status='200'
    method: GET
    request_uri: /user/2/profile
    status: 200
  • 資料脫敏

    • 使用mask函數

      mask函數 通過內建規則和關鍵字匹配兩種模式,實現對結構化與非結構化資料的精準脫敏。

      未經處理資料

      需求描述

      SPL語句

      結果

      client_ip: 192.168.1.123
      latency: 100

      對 IP 做脫敏處理。

      * | extend client_ip =  mask(client_ip,'[
                   {"mode":"buildin","types":["IP_ADDRESS"],"maskChar":"*","keepPrefix":3,"keepSuffix":3}
                  ]')
      client_ip: 192*****123
      latency: 100
      2025-08-20 18:04:40,998 INFO  blockchain-event-poller-3 [10.0.1.20] [com.service.listener.TransactionStatusListener:65] [TransactionStatusListener#handleSuccessfulTransaction]{"message":"On-chain transaction successfully confirmed","confirmationDetails":{"transactionHash":"0x2baf892e9a164b1979","status":"success","blockNumber":45101239,"gasUsed":189543,"effectiveGasPrice":"58.2 Gwei","userProfileSnapshot":{"wallet":"0x71C7656EC7a5f6d8A7C4","sourceIp":"203.0.113.55","phone":"19901012345","address":"上海市浦東新區文明路1000號","birthday":null}}}

      需要對日誌中的錢包地址、地址資訊、來源IP、手機號、交易雜湊等敏感欄位進行脫敏。

      *| extend content =  mask(content,'[
                 {"mode":"keyword","keys":["wallet","address","sourceIp","phone","transactionHash"], "maskChar":"*","keepPrefix":3,"keepSuffix":3}
               ]')
      2025-08-20 18:04: 40, 998 INFO blockchain-event-poller-3 [10.0.1.20][com.service.listener.TransactionStatusListener: 65]][TransactionStatusListener#handleSuccessfulTransaction]{"message": "0n-chain transaction successfully confirmed", "confirmationDetails": {"transactionHash": "0×2**************979", "status": "success", "blockNumber": 45101239, "gasUsed": 189543, "effectiveGasPrice": "58.2 Gwei", "userProfileSnapshot": {"wallet": "0x7****************7C4", "sourceIp": "203******.55", "phone": "199*****345", "address": "上海市*********00號", "birthday": null}}}

    • 使用Regex

      通過 SPLextend指令結合正則處理、字串處理、URL處理等 SQL 函數,可以實現資料的脫敏操作。

      使用regexp_replace函數對欄位的值進行正則替換的時候,支援使用擷取的群組。在替換值的時候,可以使用\1\2… 分別表示第一個、第二個…擷取的群組的值。

      例如 regexp_replace('192.168.1.1', '(\d+)\.(\d+)\.\d+\.\d+', '\1.\2.*.*')結果為192.168.*.*

      未經處理資料

      需求描述

      SPL語句

      結果

      request_uri: /api/v1/resources?user=123&ticket=abc
      status: 200

      request_uri參數中包含一些敏感資訊,需要移除。

      * | extend request_uri=url_extract_path(request_uri)

      或者

      * | extend request_uri=regexp_replace(request_uri, '\?.*', '')
      request_uri: /api/v1/resources
      status: 200
      client_ip: 192.168.1.123
      latency: 100

      對 IP 做脫敏處理,將中間兩部分替換為星號。

      * | extend client_ip=regexp_replace(client_ip, '(\d+)\.\d+\.\d+\.(\d+)', '\1.*.*.\2')
      client_ip: 192.*.*.123
      latency: 100
      sql: SELECT id, name, config FROM app_info WHERE name="test-app"
      result_size: 1024

      sql欄位中可能包含一些敏感資訊,因此需要僅保留操作以及對應的表名即可。

      *
      | extend table=regexp_extract(sql, '\bFROM\s+([^\s;]+)|\bINTO\s+([^\s;]+)|\bUPDATE\s+([^\s;]+)', 1)
      | extend action=regexp_extract(sql,'\b(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)\b', 1)
      | project-away sql
      action: SELECT
      table: app_info
      result_size: 1024