Journald 日誌驅動程式
journald
日誌記錄驅動將容器日誌傳送到 systemd
journal。可以使用 journalctl
命令、journal
API 或 docker logs
命令來檢索日誌條目。
除了日誌訊息本身的文字外,journald
日誌驅動程式還在日誌中為每條訊息儲存以下元資料:
欄位 | 描述 |
---|---|
CONTAINER_ID | 截斷為 12 個字元的容器 ID。 |
CONTAINER_ID_FULL | 完整的 64 位字元容器 ID。 |
CONTAINER_NAME | 容器啟動時的名稱。如果使用 docker rename 重新命名容器,新名稱不會反映在 journal 條目中。 |
CONTAINER_TAG , SYSLOG_IDENTIFIER | 容器標籤(日誌標籤選項文件)。 |
CONTAINER_PARTIAL_MESSAGE | 一個標記日誌完整性的欄位。改善長日誌行的記錄。 |
IMAGE_NAME | 容器映象的名稱。 |
用法
要將 journald
驅動用作預設日誌記錄驅動,請在 daemon.json
檔案中將 log-driver
和 log-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 | 可選 | 指定模板以在 journald 日誌中設定 CONTAINER_TAG 和 SYSLOG_IDENTIFIER 的值。請參閱 日誌標籤選項文件來自定義日誌標籤格式。 |
labels | 可選 | 以逗號分隔的標籤鍵列表,如果為容器指定了這些標籤,則應包含在訊息中。 |
labels-regex | 可選 | 與 labels 類似且相容。一個用於匹配與日誌記錄相關的標籤的正則表示式。用於高階 日誌標籤選項。 |
env | 可選 | 以逗號分隔的環境變數鍵列表,如果為容器指定了這些變數,則應包含在訊息中。 |
env-regex | 可選 | 與 env 類似且相容。一個用於匹配與日誌記錄相關的環境變數的正則表示式。用於高階 日誌標籤選項。 |
如果 label
和 env
選項之間發生衝突,則 env
的值優先。每個選項都會向日志訊息的屬性新增額外的欄位。
以下是記錄到 journald 所需的日誌記錄選項的示例。
$ docker run \
--log-driver=journald \
--log-opt labels=location \
--log-opt env=TEST \
--env "TEST=false" \
--label location=west \
your/application
此配置還指示驅動程式在有效負載中包含標籤 location 和環境變數 TEST
。如果省略 --env "TEST=false"
或 --label location=west
引數,相應的鍵將不會在 journald 日誌中設定。
關於容器名稱的說明
在 CONTAINER_NAME
欄位中記錄的值是容器啟動時設定的名稱。如果您使用 docker rename
來重新命名容器,新名稱不會反映在 journal 條目中。Journal 條目將繼續使用原始名稱。
使用 `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
被附加到行的末尾,除非設定了 --all
,否則 journalctl
不會自動剝離它。
$ 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)