全部產品
Search
文件中心

Simple Log Service:Log Service虛刪除

更新時間:Jan 10, 2026

阿里雲Log Service新增虛刪除(Soft Deletion) 功能,允許使用者在刪除日誌資料時,將資料標記為“已刪除”狀態而非立即物理清除。本文主要介紹如何進行虛刪除。

重要

Log Service虛刪除功能按照使用者和地區灰階,如需要開啟,請提工單申請。

背景資訊

在資料驅動環境下,日誌和可觀測資料成為企業關鍵資產,但也帶來了資料管理、合規性和安全性等挑戰。為應對這些問題,阿里雲Log Service(SLS)推出虛刪除(Soft Deletion)功能,提供可追溯的刪除操作機制,為您的資料安全與合規體系提供的一項關鍵能力和一個強大的安全網。

工作原理(點擊查看)

虛刪除是標記而非擦除,虛刪除的實現機制,完美平衡了資料的邏輯刪除與物理存在,其工作流程如下:

  1. 發起刪除任務:使用者通過SDK或控制台,指定時間範圍和查詢條件(Query),發起一個非同步刪除任務。

  2. 精確標記:SLS的後端服務會根據您的查詢條件,精確定位到所有匹配的日誌條目。它並不會物理擦除這些資料,而是為它們添加一個內部的、不可見的刪除標記。

  3. 查詢透明:一旦資料被標記,所有常規的GetLogs, GetHistograms, SQL分析等查詢請求將自動過濾這些資料。對於上層應用和使用者而言,這些資料已經消失了。

  4. 保留與恢複:被標記的資料將在您預設的保留期(例如1天到365天)內繼續實體儲存體。目前暫不支援資料恢複。

  5. 永久清除:當超過保留期後,SLS的回收機制將介入,對這些資料進行無法復原的物理刪除,釋放儲存空間。

應用情境(點擊查看)

阿里雲Log Service(SLS)的 虛刪除(Soft Deletion) 功能通過標記資料為可刪除狀態而非立即物理清除,解決了以下核心資料管理問題:

  • 合規性與審計要求

    • 情境:金融監管或 GDPR 等法規要求企業具備按需刪除資料的能力,並留存刪除操作的審計記錄。

    • 實現:虛刪除操作會產生系統日誌,記錄刪除時間、操作者及資料範圍,滿足審計合規性要求。

  • 開發測試環境資料管理

    • 情境:測試團隊需定期清理舊測試資料以準備新壓測。

    • 實現:支援批量虛刪除指定資料,保留 Logstore 結構及配置,避免因物理刪除導致的重建成本。

  • 髒資料清理

    • 情境:線上故障導致採集異常資料,影響分析準確性。

    • 實現:快速隔離並標記髒資料,確保業務視圖僅包含高品質資料,同時保留未經處理資料供後續排查。

此功能與 SLS 的安全合規能力(如伺服器端加密、細粒度許可權管控)形成協同,滿足企業級資料治理需求。

注意事項

  1. 儲存成本考量:虛刪除的資料在保留期內依然佔用儲存空間併產生費用。資料需要等Logstore到期才會真正物理刪除。

  2. 查詢語句的精確性在刪除前,先查詢。在執行刪除操作之前,務必使用完全相同的查詢時間和查詢語句執行一次查詢操作,預覽將要被刪除的資料,確認無誤後再執行刪除。

  3. 虛刪除的日誌不可查詢分析(包括查詢、SQL 分析、ScheduledSQL、警示功能),對串流操作不影響(包括消費、資料加工、投遞等)。

  4. 虛刪除無法復原,日誌刪除了不可恢複。

支援地區

目前新加坡和華北6(烏蘭察布)支援虛刪除。您可以在Project的概覽頁面,查看該Project所在地區的服務入口。各地區的Region ID,請參見服務入口

許可權須知

  • 若您使用阿里雲主帳號登入,預設擁有所有操作許可權,可直接對Project進行相關操作。

  • 若您使用RAM使用者登入,請根據需要向主帳號使用者申請如下兩種Log Service的系統策略。

    • 系統權限原則:許可權範圍較大,使用者無法修改系統權限原則的內容,但配置步驟簡單。

      • AliyunLogFullAccess:管理Log Service的許可權。

      • AliyunLogReadOnlyAccess:唯讀訪問Log Service的許可權。

    • 自訂權限原則:強烈建議遵循最小許可權原則,僅為受信任的人員或自動化服務授予最小資源粒度許可權。

      自訂權限原則指令碼如下:

      {
        "Version": "1",
        "Statement": [
          {
            "Action": [
              "log:DeleteLogStoreLogs",
              "log:GetDeleteLogStoreLogsTask",
              "log:ListDeleteLogStoreLogsTasks",
            ],
            "Resource": [
              "acs:log:*:*:project/Project名稱/logstore/LogStore名稱"
            ]
            "Effect": "Allow"
          }
        ]
      }

控制台操作

  1. 登入Log Service控制台,在Project列表,單擊開啟目標Project。

  2. 日誌儲存 > 日誌庫頁簽中,單擊目標Logstore。

  3. 在Logstore的查詢和分析頁面,輸入查詢語句,然後選擇時間範圍。在原始日誌頁簽中,單擊image > 日誌虛刪除

    image

  4. 日誌虛刪除對話方塊中,請仔細閱讀對話方塊資訊後,單擊確認刪除日誌。刪除完成後,日誌不可見。

  5. 刪除完成後,在原始日誌頁簽中,單擊image > 虛刪除任務。在虛刪除任務列表中,可以查看歷史刪除任務。

SDK操作

Python

  1. 使用pip show aliyun-log-python-sdk檢查aliyun-log-python-sdk版本。

    aliyun-log-python-sdk版本要求不能低於0.9.28,如果低於該版本,使用pip install -U aliyun-log-python-sdk升級SDK版本。

  2. 提交虛刪除任務。.

    DeleteLogsRequest參數說明如下:

    參數說明

    樣本

    # 匯入必要的庫
    import time
    from aliyun.log import LogClient, DeleteLogsRequest, DeleteLogsResponse
    
    def execute_soft_delete(client: LogClient, project: str, logstore: str, from_time: int, to_time: int, query: str) -> str:
        """
        執行一個非同步虛刪除任務。
    
        :param client: 已初始化的SLS用戶端執行個體。
        :param project: 您的SLS專案名稱。
        :param logstore: 您的Logstore名稱。
        :param from_time: 刪除範圍的開始時間戳(秒)。
        :param to_time: 刪除範圍的結束時間戳記(秒)。
        :param query: 用來篩選要刪除日誌的純索引查詢語句(不支援sql、scan、短語查詢語句)。
        :return: 非同步刪除任務的Task ID,用於後續查詢任務狀態。
        """
        print(f"準備在專案'{project}'的Logstore'{logstore}'中執行虛刪除...")
        print(f"時間範圍: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(from_time))} -> {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(to_time))}")
        print(f"刪除條件(Query): {query}")
    
        # 1. 構造刪除請求對象
        request = DeleteLogsRequest(project, logstore, from_time, to_time, query=query)
    
        # 2. 發起非同步刪除請求
        try:
            res: DeleteLogsResponse = client.delete_logs(request)
            
            # 3. 列印請求資訊和返回的任務ID
            print("\n--- 請求回執 ---")
            res.log_print()
            task_id = res.get_taskid()
            print(f"✅ 虛刪除任務已成功提交!Request ID: {res.get_request_id()}, Task ID: {task_id}")
            return task_id
        except Exception as e:
            print(f"❌ 虛刪除任務提交失敗: {e}")
            return ""
    
    # --- 如何調用 ---
    # client = LogClient(...) # 此處省略用戶端初始化過程
    
    # project_name = "my-prod-app"
    # logstore_name = "nginx-access-log"
    # # 情境:刪除過去24小時內,所有狀態代碼為500且來自特定IP的訪問日誌
    # start_time = int(time.time()) - 86400 
    # end_time = int(time.time())
    # delete_query = "__source__: 123.123.XXX.XXX and status: 500"
    
    # task_id = execute_soft_delete(client, project_name, logstore_name, start_time, end_time, delete_query)
    # if task_id:
    #     print(f"\n請使用Task ID '{task_id}' 查詢任務執行狀態。")
    

    project String 必選

    Project名稱:專案(Project)是Log Service的資源嵌入式管理單元,是進行多使用者隔離與存取控制的主要邊界。更多資訊,請參見管理Project

    logstore String 必選

    Logstore名稱:Logstore是Log Service中日誌資料的採集、儲存和查詢單元。更多資訊,請參見管理LogStore

    fromTime int (必選)

    查詢開始的時間點,使用Unix時間戳記格式。

    toTime int (必選)

    查詢結束的時間點,使用Unix時間戳記格式。

    query String 必選

    查詢語句或分析語句。更多資訊,請參見查詢與分析概述

    請謹慎設定"*""level: ERROR",這可能會導致大範圍的資料被意外刪除。
  3. 輪詢任務狀態。

    該段代碼會持續檢查任務進度,直到其完成或逾時,這是確保刪除操作成功執行的關鍵步驟。

    delete_logs是一個非同步API。調用成功僅代表任務被接受,您需要使用返回的task_id來輪詢任務的最終狀態。

    from aliyun.log import GetDeleteLogsStatusRequest, GetDeleteLogsStatusResponse
    
    def wait_for_task_completion(client: LogClient, project: str, logstore: str, task_id: str, timeout_seconds: int = 300):
        """通過輪詢等待虛刪除任務完成。"""
        start_time = time.time()
        while time.time() - start_time < timeout_seconds:
            request = GetDeleteLogsStatusRequest(project, logstore, task_id)
            try:
                res: GetDeleteLogsStatusResponse = client.get_delete_logs_status(request)
                progress = res.get_process()
                print(f"查詢任務 '{task_id}' 狀態...進度: {progress:.2f}%")
                if progress >= 100.0:
                    print("✅ 任務已完成!")
                    return True
                time.sleep(2)  # 避免過於頻繁的輪詢
            except Exception as e:
                print(f"❌ 查詢任務狀態失敗: {e}")
                return False
        print(f"⌛️ 任務逾時(超過 {timeout_seconds} 秒),請稍後重試或檢查任務狀態。")
        return False
    
    # --- 如何調用 ---
    # task_id = execute_soft_delete(...)
    # if task_id:
    #     wait_for_task_completion(client, project_name, logstore_name, task_id)
    
  4. 審計與管理(查看歷史任務)。

    該功能對於安全審計和營運管理來說至關重要,它提供了所有刪除操作的完整記錄。
    from aliyun.log import ListDeleteLogsTasksRequest
    
    def list_all_delete_tasks(client: LogClient, project: str, logstore: str):
        """列出指定Logstore下的所有虛刪除任務歷史。"""
        print(f"\n正在列出專案'{project}'的Logstore'{logstore}'下的虛刪除任務歷史...")
        request = ListDeleteLogsTasksRequest(project=project, logstore=logstore)
        try:
            res = client.list_delete_logs_tasks(request)
            print("✅ 工作清單擷取成功!")
            res.log_print() # log_print()會以易讀的格式列印所有任務詳情
        except Exception as e:
            print(f"❌ 擷取工作清單失敗: {e}")