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-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可选指定模板以在 journald 日志中设置 CONTAINER_TAGSYSLOG_IDENTIFIER 的值。请参阅 日志标签选项文档来自定义日志标签格式。
labels可选以逗号分隔的标签键列表,如果为容器指定了这些标签,则应包含在消息中。
labels-regex可选与 labels 类似且兼容。一个用于匹配与日志记录相关的标签的正则表达式。用于高级 日志标签选项
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

此配置还指示驱动程序在有效负载中包含标签 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)
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.