Journald 日誌驅動程式
journald 記錄驅動程式會將容器記錄發送到 systemd journal。記錄條目可以使用 journalctl 指令、透過 journal API 或使用 docker logs 指令進行檢索。
除了記錄訊息本身的文字外,journald 記錄驅動程式還會在 journal 中儲存每條訊息的以下中繼資料:
| 欄位 | 描述 |
|---|---|
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-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
此設定還會引導驅動程式將標籤位置 (label 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)