設定日誌驅動程式
Docker 包含多種日誌記錄機制,可協助您從執行中的容器和服務中獲取資訊。這些機制稱為日誌驅動程式。每個 Docker 守護程式都有一個預設的日誌驅動程式,除非您配置容器使用不同的日誌驅動程式(簡稱 log driver),否則每個容器都會使用此預設值。
預設情況下,Docker 使用 json-file 日誌驅動程式,該驅動程式會在內部將容器日誌快取為 JSON 格式。除了使用 Docker 隨附的日誌驅動程式外,您還可以實作並使用 日誌驅動程式外掛程式。
提示使用
local日誌驅動程式可防止磁碟耗盡。預設情況下,不執行日誌輪替 (log-rotation)。因此,對於產生大量輸出的容器,預設的json-file日誌驅動程式所儲存的日誌檔案可能會佔用大量磁碟空間,進而導致磁碟空間耗盡。Docker 將
json-file日誌驅動程式(不含日誌輪替)保留為預設值,是為了保持與舊版 Docker 的向後相容性,以及在將 Docker 用作 Kubernetes 執行環境的情況下使用。對於其他情況,建議使用
local日誌驅動程式,因為它預設會執行日誌輪替,並使用更有效率的檔案格式。請參閱下方的 配置預設日誌驅動程式 章節以了解如何將local日誌驅動程式設定為預設值,並參閱 本機檔案日誌驅動程式 頁面以獲取有關local日誌驅動程式的更多詳細資訊。
配置預設日誌驅動程式
若要將 Docker 守護程式預設為特定日誌驅動程式,請在 daemon.json 設定檔中將 log-driver 的值設定為該日誌驅動程式的名稱。詳細資訊請參閱 dockerd 參考手冊 中的「守護程式設定檔」章節。
預設的日誌驅動程式為 json-file。以下範例將預設日誌驅動程式設定為 local 日誌驅動程式
{
"log-driver": "local"
}如果日誌驅動程式具有可配置選項,您可以將它們作為 JSON 物件並以 log-opts 為鍵值,設定在 daemon.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 守護程式目前的預設日誌驅動程式,請執行 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 訊息傳遞模式可防止應用程式因日誌背壓 (back pressure) 而被封鎖。當 STDERR 或 STDOUT 串流被封鎖時,應用程式很可能會以非預期的方式失敗。
警告當緩衝區滿時,新訊息將不會被放入佇列。丟棄訊息通常比封鎖應用程式的日誌寫入程序更為理想。
mode 日誌選項用於控制是否使用 blocking(預設)或 non-blocking 訊息傳遞。
max-buffer-size 控制當 mode 設定為 non-blocking 時,用於臨時訊息儲存的緩衝區大小。預設值為 1m,即 1 MB(100 萬位元組)。請參閱 go-units 套件中的 FromHumanSize() 函式 以了解允許的格式字串,例如 1KiB 代表 1024 位元組,2g 代表 20 億位元組。
以下範例以非封鎖模式啟動一個 Alpine 容器,並設定 4 MB 的緩衝區
$ 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"}支援的日誌驅動程式
支援以下日誌驅動程式。如適用,請參閱各驅動程式文件中的連結以了解其可配置選項。如果您正在使用 日誌驅動程式外掛程式,您可能會看到更多選項。
| 驅動程式 | 描述 |
|---|---|
無 | 容器沒有可用的日誌,且 docker logs 不會回傳任何輸出。 |
local | 日誌以專為最小負擔設計的自訂格式儲存。 |
json-file | 日誌格式化為 JSON。Docker 的預設日誌驅動程式。 |
syslog | 將日誌訊息寫入 syslog 工具。syslog 守護程式必須在主機上執行。 |
journald | 將日誌訊息寫入 journald。journald 守護程式必須在主機上執行。 |
gelf | 將日誌訊息寫入 Graylog Extended Log Format (GELF) 端點,例如 Graylog 或 Logstash。 |
fluentd | 將日誌訊息寫入 fluentd (forward input)。fluentd 守護程式必須在主機上執行。 |
awslogs | 將日誌訊息寫入 Amazon CloudWatch Logs。 |
splunk | 使用 HTTP Event Collector 將日誌訊息寫入 splunk。 |
etwlogs | 將日誌訊息寫入 Windows 事件追蹤 (ETW) 事件。僅適用於 Windows 平台。 |
gcplogs | 將日誌訊息寫入 Google Cloud Platform (GCP) Logging。 |
日誌驅動程式的限制
- 讀取日誌資訊需要解壓縮輪替後的日誌檔案,這會導致磁碟使用量暫時增加(直到讀取輪替檔案中的日誌條目為止),並在解壓縮時增加 CPU 使用率。
- Docker 資料目錄所在的主機儲存容量決定了日誌檔案資訊的最大大小。