配置日誌驅動

Docker 包含多種日誌機制,可幫助你從執行的容器和服務中 獲取資訊。這些機制被稱為日誌驅動程式。每個 Docker 守護程序都有一個預設的日誌驅動程式,每個容器都會使用它,除非你配置它使用不同的日誌驅動程式,或簡稱日誌驅動程式。

預設情況下,Docker 使用 json-file 日誌驅動程式,它將容器日誌作為 JSON 內部快取。除了使用 Docker 附帶的日誌驅動程式外,你還可以實現和使用 日誌驅動程式外掛

提示:使用 local 日誌驅動程式來防止磁碟耗盡

預設情況下,不會執行日誌輪轉。因此,預設的 json-file 日誌驅動程式 日誌驅動程式儲存的日誌檔案可能會導致大量磁碟空間用於生成大量輸出的容器,從而導致磁碟空間耗盡。

Docker 保留 json-file 日誌驅動程式(不進行日誌輪轉)作為預設設定,以保持與舊版 Docker 的向後相容性,以及 Docker 用作 Kubernetes 執行時的場景。

對於其他情況,建議使用 local 日誌驅動程式,因為它預設執行日誌輪轉,並使用更有效的檔案格式。請參閱下面的 配置預設日誌驅動程式 部分,瞭解如何配置 local 日誌驅動程式作為預設驅動程式,以及 本地檔案日誌驅動程式 頁面,以詳細瞭解 local 日誌驅動程式。

配置預設日誌驅動程式

要配置 Docker 守護程序以預設使用特定日誌驅動程式,請在 daemon.json 配置檔案中將 log-driver 的值設定為日誌驅動程式的名稱。有關詳細資訊,請參閱 dockerd 參考手冊 中的“守護程序配置檔案”部分。

預設日誌驅動程式為 json-file。以下示例將預設日誌驅動程式設定為 local 日誌驅動程式

{
  "log-driver": "local"
}

如果日誌驅動程式具有可配置選項,你可以在 daemon.json 檔案中以 JSON 物件形式設定它們,其鍵為 log-opts。以下示例在 json-file 日誌驅動程式上設定四個可配置選項

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

重新啟動 Docker 以使更改對新建立的容器生效。現有容器不會自動使用新的日誌記錄配置。

注意

daemon.json 配置檔案中的 log-opts 配置選項必須作為字串提供。因此,布林值和數值(例如上面示例中的 max-file 的值)必須用引號 (") 括起來。

如果未指定日誌驅動程式,則預設值為 json-file。要查詢 Docker 守護程序的當前預設日誌驅動程式,請執行 docker info 並搜尋 Logging Driver。你可以在 Linux、macOS 或 Windows 上的 PowerShell 上使用以下命令

$ docker info --format '{{.LoggingDriver}}'

json-file

注意

更改守護程序配置中的預設日誌驅動程式或日誌驅動程式選項只會影響配置更改後建立的容器。現有容器將保留建立時使用的日誌驅動程式選項。要更新容器的日誌驅動程式,必須使用所需選項重新建立容器。請參閱下面的 配置容器的日誌驅動程式 部分,瞭解如何查詢容器的日誌驅動程式配置。

配置容器的日誌驅動程式

啟動容器時,可以使用 --log-driver 標誌配置它使用與 Docker 守護程序的預設值不同的日誌驅動程式。如果日誌驅動程式具有可配置選項,可以使用 --log-opt <NAME>=<VALUE> 標誌的一個或多個例項設定它們。即使容器使用預設日誌驅動程式,它也可以使用不同的可配置選項。

以下示例使用 none 日誌驅動程式啟動一個 Alpine 容器。

$ docker run -it --log-driver none alpine ash

要查詢執行容器的當前日誌驅動程式,如果守護程序使用 json-file 日誌驅動程式,請執行以下 docker inspect 命令,將容器名稱或 ID 替換為 <CONTAINER>

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

json-file

配置從容器到日誌驅動程式的日誌訊息傳遞模式

Docker 提供兩種模式來將訊息從容器傳遞到日誌驅動程式

  • (預設) 從容器到驅動程式的直接阻塞傳遞
  • 非阻塞傳遞,將日誌訊息儲存在中間的每個容器緩衝區中,供驅動程式使用

non-blocking 訊息傳遞模式可防止應用程式因日誌反壓而阻塞。當 STDERR 或 STDOUT 流阻塞時,應用程式很可能會以意想不到的方式失敗。

警告

當緩衝區已滿時,不會排隊新的訊息。刪除訊息通常優先於阻止應用程式的日誌寫入過程。

mode 日誌選項控制是否使用 blocking(預設)或 non-blocking 訊息傳遞。

max-buffer-size 日誌選項控制當 mode 設定為 non-blocking 時用於中間訊息儲存的緩衝區大小。max-buffer-size 預設值為 1 兆位元組。

以下示例使用非阻塞模式和 4 兆位元組緩衝區啟動一個 Alpine 容器,其日誌輸出為非阻塞模式。

$ docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1

在日誌驅動程式中使用環境變數或標籤

某些日誌驅動程式會將容器的 --env|-e--label 標誌的值新增到容器的日誌中。此示例使用 Docker 守護程序的預設日誌驅動程式(在以下示例中為 json-file)啟動一個容器,但設定環境變數 os=ubuntu

$ docker run -dit --label production_status=testing -e os=ubuntu alpine sh

如果日誌驅動程式支援,這會在日誌輸出中新增其他欄位。以下輸出由 json-file 日誌驅動程式生成

"attrs":{"production_status":"testing","os":"ubuntu"}

支援的日誌驅動程式

支援以下日誌驅動程式。請參閱每個驅動程式文件的連結,瞭解其可配置選項(如果適用)。如果使用 日誌驅動程式外掛,你可能會看到更多選項。

驅動程式描述
none容器沒有可用的日誌,docker logs 不會返回任何輸出。
local日誌儲存在為最小開銷設計的自定義格式中。
json-file日誌格式化為 JSON。Docker 的預設日誌驅動程式。
syslog將日誌訊息寫入 syslog 設施。syslog 守護程序必須在主機上執行。
journald將日誌訊息寫入 journaldjournald 守護程序必須在主機上執行。
gelf將日誌訊息寫入 Graylog 擴充套件日誌格式 (GELF) 端點,例如 Graylog 或 Logstash。
fluentd將日誌訊息寫入 fluentd(轉發輸入)。fluentd 守護程序必須在主機上執行。
awslogs將日誌訊息寫入 Amazon CloudWatch Logs。
splunk使用 HTTP 事件收集器將日誌訊息寫入 splunk
etwlogs將日誌訊息作為 Windows 的事件跟蹤 (ETW) 事件寫入。僅在 Windows 平臺上可用。
gcplogs將日誌訊息寫入 Google Cloud Platform (GCP) 日誌記錄。

日誌驅動程式的侷限性

  • 讀取日誌資訊需要解壓縮輪轉的日誌檔案,這會導致磁碟使用量暫時增加(直到讀取輪轉檔案中的日誌條目)以及解壓縮期間 CPU 使用量增加。
  • Docker 資料目錄所在的宿主儲存容量決定了日誌檔案資訊的最大大小。