ETW 日誌驅動程式
目錄
Event Tracing for Windows (ETW) 記錄驅動程式會將容器日誌轉送為 ETW 事件。ETW 代表 Windows 事件追蹤,是 Windows 中用於追蹤應用程式的通用框架。每個 ETW 事件都包含一則包含日誌及其上下文資訊的訊息。客戶端隨後可以建立一個 ETW 監聽器來監聽這些事件。
此記錄驅動程式向 Windows 註冊的 ETW 提供者具有以下 GUID 識別碼:{a3693192-9ed6-46d2-a981-f8226c8363bd}。客戶端會建立一個 ETW 監聽器並註冊以監聽來自該記錄驅動程式提供者的事件。提供者和監聽器建立的順序並不重要。客戶端可以在提供者向系統註冊之前,先建立他們的 ETW 監聽器並開始監聽來自該提供者的事件。
使用方式
以下是如何使用大多數 Windows 安裝中隨附的 logman 工具程式來監聽這些事件的範例:
logman start -ets DockerContainerLogs -p "{a3693192-9ed6-46d2-a981-f8226c8363bd}" 0x0 -o trace.etl- 透過在 Docker 執行命令中新增
--log-driver=etwlogs,以 etwlogs 驅動程式執行您的容器,並產生日誌訊息。 logman stop -ets DockerContainerLogs- 這會產生一個包含事件的 etl 檔案。將此檔案轉換為人類可讀形式的一種方法是執行:
tracerpt -y trace.etl。
每個 ETW 事件都包含一個以此格式呈現的結構化訊息字串:
container_name: %s, image_name: %s, container_id: %s, image_id: %s, source: [stdout | stderr], log: %s訊息中每個項目的詳細資料如下:
| 欄位 | 描述 |
|---|---|
container_name | 容器啟動時的容器名稱。 |
image_name | 容器映像檔的名稱。 |
container_id | 完整的 64 字元容器 ID。 |
image_id | 容器映像檔的完整 ID。 |
來源 | stdout 或 stderr。 |
log | 容器日誌訊息。 |
以下是一個事件訊息範例(為提高可讀性而格式化的輸出):
container_name: backstabbing_spence,
image_name: windowsservercore,
container_id: f14bb55aa862d7596b03a33251c1be7dbbec8056bbdead1da8ec5ecebbe29731,
image_id: sha256:2f9e19bd998d3565b4f345ac9aaf6e3fc555406239a4fb1b1ba879673713824b,
source: stdout,
log: Hello world!客戶端可以解析此訊息字串以取得日誌訊息及其上下文資訊。時間戳記也可在 ETW 事件中取得。
注意此 ETW 提供者僅發出訊息字串,而非特別結構化的 ETW 事件。因此,您不需要向系統註冊資訊清單檔案(manifest file)即可讀取及解譯其 ETW 事件。