阿里雲Log Service新增虛刪除(Soft Deletion) 功能,允許使用者在刪除日誌資料時,將資料標記為“已刪除”狀態而非立即物理清除。本文主要介紹如何進行虛刪除。
Log Service虛刪除功能按照使用者和地區灰階,如需要開啟,請提工單申請。
背景資訊
在資料驅動環境下,日誌和可觀測資料成為企業關鍵資產,但也帶來了資料管理、合規性和安全性等挑戰。為應對這些問題,阿里雲Log Service(SLS)推出虛刪除(Soft Deletion)功能,提供可追溯的刪除操作機制,為您的資料安全與合規體系提供的一項關鍵能力和一個強大的安全網。
工作原理(點擊查看)
應用情境(點擊查看)
注意事項
儲存成本考量:虛刪除的資料在保留期內依然佔用儲存空間併產生費用。資料需要等Logstore到期才會真正物理刪除。
查詢語句的精確性:在刪除前,先查詢。在執行刪除操作之前,務必使用完全相同的查詢時間和查詢語句執行一次查詢操作,預覽將要被刪除的資料,確認無誤後再執行刪除。
虛刪除的日誌不可查詢分析(包括查詢、SQL 分析、ScheduledSQL、警示功能),對串流操作不影響(包括消費、資料加工、投遞等)。
虛刪除無法復原,日誌刪除了不可恢複。
支援地區
目前新加坡和華北6(烏蘭察布)支援虛刪除。您可以在Project的概覽頁面,查看該Project所在地區的服務入口。各地區的Region ID,請參見服務入口。
許可權須知
若您使用阿里雲主帳號登入,預設擁有所有操作許可權,可直接對Project進行相關操作。
若您使用RAM使用者登入,請根據需要向主帳號使用者申請如下兩種Log Service的系統策略。
系統權限原則:許可權範圍較大,使用者無法修改系統權限原則的內容,但配置步驟簡單。
AliyunLogFullAccess:管理Log Service的許可權。
AliyunLogReadOnlyAccess:唯讀訪問Log Service的許可權。
自訂權限原則:強烈建議遵循最小許可權原則,僅為受信任的人員或自動化服務授予最小資源粒度許可權。
自訂權限原則指令碼如下:
指令碼中的
Project名稱和Logstore名稱請根據實際情況替換。為RAM配置更多許可權請參見Log ServiceRAM存取控制許可權配置和授權資訊。
{ "Version": "1", "Statement": [ { "Action": [ "log:DeleteLogStoreLogs", "log:GetDeleteLogStoreLogsTask", "log:ListDeleteLogStoreLogsTasks", ], "Resource": [ "acs:log:*:*:project/Project名稱/logstore/LogStore名稱" ] "Effect": "Allow" } ] }
控制台操作
登入Log Service控制台,在Project列表,單擊開啟目標Project。
在頁簽中,單擊目標Logstore。
在Logstore的查詢和分析頁面,輸入查詢語句,然後選擇時間範圍。在原始日誌頁簽中,單擊。

在日誌虛刪除對話方塊中,請仔細閱讀對話方塊資訊後,單擊確認刪除日誌。刪除完成後,日誌不可見。
刪除完成後,在原始日誌頁簽中,單擊。在虛刪除任務列表中,可以查看歷史刪除任務。
SDK操作
Python
使用
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版本。提交虛刪除任務。.
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",這可能會導致大範圍的資料被意外刪除。輪詢任務狀態。
該段代碼會持續檢查任務進度,直到其完成或逾時,這是確保刪除操作成功執行的關鍵步驟。
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)審計與管理(查看歷史任務)。
該功能對於安全審計和營運管理來說至關重要,它提供了所有刪除操作的完整記錄。
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}")
> 日誌虛刪除