Journald 日誌驅動程式

journald 日誌驅動程式將容器日誌傳送到 systemd 日誌。可以使用 journalctl 命令,透過使用 journal API 或使用 docker logs 命令檢索日誌條目。

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

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

用法

要使用 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 日誌驅動程式選項。

選項必需描述
tag可選指定模板以設定 CONTAINER_TAGSYSLOG_IDENTIFIER 的值在 journald 日誌中。請參閱 日誌標籤選項文件 以自定義日誌標籤格式。
labels可選標籤鍵的逗號分隔列表,如果為容器指定了這些標籤,則應將這些標籤包含在訊息中。
labels-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)