配置日誌驅動程式
Docker 包含多種日誌記錄機制,可幫助您從正在執行的容器和服務中獲取資訊。這些機制稱為日誌驅動程式。每個 Docker 守護程序都有一個預設的日誌驅動程式,每個容器都使用它,除非您將其配置為使用不同的日誌驅動程式(簡稱 log driver)。
預設情況下,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
命令,並將 <CONTAINER>
替換為容器名稱或 ID。
$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
json-file
配置從容器到日誌驅動程式的日誌訊息傳遞模式
Docker 提供了兩種將訊息從容器傳遞到日誌驅動程式的模式:
- (預設)從容器到驅動程式的直接、阻塞式傳遞
- 非阻塞式傳遞,將日誌訊息儲存在每個容器的中間緩衝區中,供驅動程式使用
non-blocking
訊息傳遞模式可防止應用程式因日誌記錄背壓而阻塞。當 STDERR 或 STDOUT 流阻塞時,應用程式很可能以意想不到的方式失敗。
警告當緩衝區滿時,新訊息將不會被排隊。丟棄訊息通常比阻塞應用程式的日誌寫入過程更可取。
mode
日誌選項控制是使用 blocking
(預設)還是 non-blocking
訊息傳遞。
當 mode
設定為 non-blocking
時,max-buffer-size
控制用於中間訊息儲存的緩衝區大小。預設值為 1m
,即 1 MB(100 萬字節)。有關允許的格式字串,請參閱 go-units
包中的 FromHumanSize()
函式,一些示例包括 1KiB
表示 1024 位元組,2g
表示 20 億位元組。
以下示例以非阻塞模式啟動一個 Alpine 容器,並使用 4 兆位元組的緩衝區進行日誌輸出。
$ 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 | 將日誌訊息寫入 journald 。journald 守護程序必須在主機上執行。 |
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 資料目錄所在的主機儲存容量決定了日誌檔案資訊的最大大小。