Journald 記錄檔驅動程式

journald 記錄驅動程式會將容器日誌傳送至 systemd 日誌。可以使用 journalctl 命令、透過 journal API 或使用 docker logs 命令來擷取日誌項目。

除了日誌訊息本身的文字之外,journald 日誌驅動程式還會將下列中繼資料儲存在每個訊息的日誌中

欄位說明
CONTAINER_ID截斷為 12 個字元的容器 ID。
CONTAINER_ID_FULL完整的 64 個字元容器 ID。
CONTAINER_NAME容器啟動時的名稱。如果您使用 docker rename 重新命名容器,則新名稱不會反映在日誌項目中。
CONTAINER_TAGSYSLOG_IDENTIFIER容器標籤(日誌標籤選項說明文件)。
CONTAINER_PARTIAL_MESSAGE標記日誌完整性的欄位。改進長日誌行的記錄。
IMAGE_NAME容器映像檔的名稱。

用法

若要使用 journald 驅動程式作為預設記錄驅動程式,請在 daemon.json 檔案中將 log-driverlog-opts 金鑰設定為適當的值,該檔案位於 Linux 主機上的 /etc/docker/ 或 Windows Server 上的 C:\ProgramData\docker\config\daemon.json。有關使用 daemon.json 設定 Docker 的詳細資訊,請參閱 daemon.json

下列範例將日誌驅動程式設定為 journald

{
  "log-driver": "journald"
}

重新啟動 Docker 以使變更生效。

若要設定特定容器的記錄驅動程式,請在 docker run 命令上使用 --log-driver 旗標。

$ docker run --log-driver=journald ...

選項

使用 --log-opt NAME=VALUE 旗標來指定其他 journald 記錄驅動程式選項。

選項必要說明
標籤選用指定範本來設定 journald 日誌中的 CONTAINER_TAGSYSLOG_IDENTIFIER 值。請參閱 日誌標籤選項說明文件來自訂日誌標籤格式。
標籤選用以逗號分隔的標籤金鑰清單,如果為容器指定了這些標籤,則應包含在訊息中。
標籤-regex選用類似於且相容於標籤。用於比對與記錄相關的標籤的正規表示式。用於進階 日誌標籤選項
env選用以逗號分隔的環境變數金鑰清單,如果為容器指定了這些變數,則應包含在訊息中。
env-regex選用類似於且相容於 env。用於比對與記錄相關的環境變數的正規表示式。用於進階 日誌標籤選項

如果 labelenv 選項之間發生衝突,則 env 的值優先。每個選項都會將其他欄位新增至記錄訊息的屬性。

以下是記錄至 journald 所需的記錄選項範例。

$ docker run \
    --log-driver=journald \
    --log-opt labels=location \
    --log-opt env=TEST \
    --env "TEST=false" \
    --label location=west \
    your/application

此設定還會指示驅動程式在有效負載中包含標籤位置和環境變數 TEST。如果省略了 --env "TEST=false"--label location=west 引數,則對應的金鑰將不會設定在 journald 日誌中。

關於容器名稱的注意事項

記錄在 CONTAINER_NAME 欄位中的值是在啟動時設定的容器名稱。如果您使用 docker rename 重新命名容器,則新名稱不會反映在日誌項目中。日誌項目會繼續使用原始名稱。

使用 journalctl 擷取日誌訊息

使用 journalctl 命令來擷取日誌訊息。您可以套用篩選條件運算式,將擷取的訊息限制為與特定容器相關聯的訊息

$ sudo journalctl CONTAINER_NAME=webserver

您可以使用其他篩選條件來進一步限制擷取的訊息。-b 旗標僅擷取自上次系統啟動以來產生的訊息

$ sudo journalctl -b CONTAINER_NAME=webserver

-o 旗標指定擷取的日誌訊息的格式。使用 -o json 以 JSON 格式傳回日誌訊息。

$ sudo journalctl -o json CONTAINER_NAME=webserver

檢視已啟用 TTY 的容器的日誌

如果在容器上啟用了 TTY,則在擷取日誌訊息時,您可能會在輸出中看到 `[10B blob data]`。原因是 `\r` 會附加到行的結尾,而且 `journalctl` 不會自動將其移除,除非設定了 `--all`。

$ sudo journalctl -b CONTAINER_NAME=webserver --all

使用 journal API 擷取日誌訊息

此範例使用 systemd Python 模組來擷取容器日誌

import systemd.journal

reader = systemd.journal.Reader()
reader.add_match('CONTAINER_NAME=web')

for msg in reader:
    print '{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg)