設定日誌驅動程式
Docker 包含多種紀錄機制,可協助您從正在執行的容器和服務取得資訊。這些機制稱為紀錄驅動程式。每個 Docker Daemon 都有一個預設紀錄驅動程式,每個容器都會使用該驅動程式,除非您將其設定為使用不同的紀錄驅動程式 (簡稱紀錄驅動程式)。
預設情況下,Docker 使用 json-file
紀錄驅動程式,它會在內部將容器紀錄快取為 JSON。除了使用 Docker 內建的紀錄驅動程式之外,您也可以實作和使用 紀錄驅動程式外掛程式。
提示
使用
local
紀錄驅動程式來防止磁碟空間不足。預設情況下,不會執行紀錄輪替。因此,由預設的json-file
紀錄驅動程式 儲存的紀錄檔可能會導致產生大量輸出的容器使用大量的磁碟空間,進而導致磁碟空間不足。Docker 將 json-file 紀錄驅動程式 (不含紀錄輪替) 保留為預設值,以維持與舊版 Docker 的回溯相容性,以及 Docker 作為 Kubernetes 執行階段的情境。
在其他情況下,建議使用
local
紀錄驅動程式,因為它預設會執行紀錄輪替,並使用更有效率的檔案格式。請參閱以下的 設定預設紀錄驅動程式 章節,以瞭解如何將local
紀錄驅動程式設定為預設值,以及 local 檔案紀錄驅動程式 頁面,以取得更多關於local
紀錄驅動程式的詳細資訊。
設定預設紀錄驅動程式
若要將 Docker Daemon 設定為預設使用特定紀錄驅動程式,請在 daemon.json
設定檔中,將 log-driver
的值設定為紀錄驅動程式的名稱。請參閱 dockerd
參考手冊 中的「daemon 設定檔」章節,以取得詳細資訊。
預設紀錄驅動程式為 json-file
。以下範例將預設紀錄驅動程式設定為 local
紀錄驅動程式
{
"log-driver": "local"
}
如果紀錄驅動程式具有可設定的選項,您可以在 daemon.json
檔案中將其設定為以 log-opts
為鍵的 JSON 物件。以下範例在 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 Daemon 目前的預設紀錄驅動程式,請執行 docker info
並搜尋 Logging Driver
。您可以在 Linux、macOS 或 Windows 上的 PowerShell 中使用以下命令
$ docker info --format '{{.LoggingDriver}}'
json-file
注意事項
變更 daemon 設定中的預設紀錄驅動程式或紀錄驅動程式選項,只會影響在變更設定後建立的容器。現有的容器會保留建立時使用的紀錄驅動程式選項。若要更新容器的紀錄驅動程式,必須使用所需的選項重新建立容器。請參閱以下的 設定容器的紀錄驅動程式 章節,以瞭解如何尋找容器的紀錄驅動程式設定。
設定容器的紀錄驅動程式
當您啟動容器時,可以使用 --log-driver
旗標將其配置為使用與 Docker Daemon 預設值不同的日誌驅動程式。如果日誌驅動程式具有可配置選項,則可以使用一個或多個 --log-opt <名稱>=<值>
旗標來設定它們。即使容器使用預設日誌驅動程式,它也可以使用不同的可配置選項。
以下範例使用 none
日誌驅動程式啟動 Alpine 容器。
$ docker run -it --log-driver none alpine ash
要查找正在執行的容器的目前日誌驅動程式,如果 Daemon 使用的是 json-file
日誌驅動程式,請執行以下 docker inspect
命令,將容器名稱或 ID 替換為 <容器>
$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
json-file
設定從容器到紀錄驅動程式的紀錄訊息傳遞模式
Docker 提供兩種模式,用於將訊息從容器傳遞到日誌驅動程式
- (預設)直接、阻塞式地從容器傳遞到驅動程式
- 非阻塞式傳遞,將日誌訊息儲存在每個容器的中間緩衝區中,供驅動程式使用
非阻塞式
訊息傳遞模式可防止應用程式因日誌回壓而阻塞。當 STDERR 或 STDOUT 串流阻塞時,應用程式可能會以意想不到的方式失敗。
警告
當緩衝區已滿時,將不會排入新的訊息。通常,捨棄訊息比阻塞應用程式的日誌寫入過程更佳。
mode
日誌選項控制是否使用阻塞式
(預設)或非阻塞式
訊息傳遞。
當 mode
設定為 non-blocking
時,max-buffer-size
控制用於中間訊息儲存的緩衝區大小。預設值為 1m
,表示 1 MB(100 萬位元組)。請參閱 go-units
套件中的函式 FromHumanSize()
以了解允許的格式字串,一些範例是 1KiB
表示 1024 位元組,2g
表示 20 億位元組。
以下範例以非阻塞模式和 4 MB 緩衝區啟動 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 Daemon 的預設日誌驅動程式(在以下範例中為 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 Daemon 必須在主機上執行。 |
journald | 將日誌訊息寫入 journald 。journald Daemon 必須在主機上執行。 |
gelf | 將日誌訊息寫入 Graylog Extended Log Format (GELF) 端點,例如 Graylog 或 Logstash。 |
fluentd | 將日誌訊息寫入 fluentd (轉發輸入)。 fluentd Daemon 必須在主機上執行。 |
awslogs | 將日誌訊息寫入 Amazon CloudWatch Logs。 |
splunk | 使用 HTTP 事件收集器將日誌訊息寫入 splunk 。 |
etwlogs | 將日誌訊息寫為 Windows 事件追蹤 (ETW) 事件。僅在 Windows 平台上可用。 |
gcplogs | 將日誌訊息寫入 Google Cloud Platform (GCP) Logging。 |
紀錄驅動程式的限制
- 讀取日誌資訊需要解壓縮輪替的日誌檔,這會導致磁碟使用量暫時增加(直到讀取輪替檔案中的日誌條目)以及解壓縮時 CPU 使用率增加。
- Docker 資料目錄所在的主機儲存容量決定了日誌檔案資訊的最大大小。