日志日志记录驱动程序

日志记录驱动程序将容器日志发送到 systemd 日志。 可以使用命令、使用 API 或命令来检索日志条目。journaldjournalctljournaldocker logs

除了日志消息本身的文本外,日志驱动程序 将以下元数据与每条消息一起存储在日志中:journald

描述
CONTAINER_ID容器 ID 被截断为 12 个字符。
CONTAINER_ID_FULL完整的 64 个字符的容器 ID。
CONTAINER_NAME启动容器时的名称。如果您用于重命名容器,则新名称不会反映在日志条目中。docker rename
CONTAINER_TAG,SYSLOG_IDENTIFIER容器标签( log tag option documentation)。
CONTAINER_PARTIAL_MESSAGE标记日志完整性的字段。改进长日志行的日志记录。
IMAGE_NAME容器镜像的名称。

用法

要将驱动程序用作默认日志记录驱动程序,请在文件中将 和 键设置为适当的值,即 位于 Linux 主机或 Windows Server 上。有关 使用 配置 Docker,请参阅 daemon.jsonjournaldlog-driverlog-optsdaemon.json/etc/docker/C:\ProgramData\docker\config\daemon.jsondaemon.json

以下示例将日志驱动程序设置为:journald

{
  "log-driver": "journald"
}

重新启动 Docker 以使更改生效。

要为特定容器配置日志记录驱动程序,请在命令中使用 flag。--log-driverdocker run

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

选项

使用标志指定其他日志记录 驱动程序选项。--log-opt NAME=VALUEjournald

选择必填描述
tag自选指定要在 journald logs 中设置的模板和值。请参阅 log tag option 文档以自定义日志标签格式。CONTAINER_TAGSYSLOG_IDENTIFIER
labels自选以逗号分隔的标签键列表,如果为容器指定了这些标签,则应包含在 message 中。
labels-regex自选与 labels 类似并兼容。用于匹配与日志记录相关的标签的正则表达式。用于高级日志标记选项
env自选以逗号分隔的环境变量键列表,如果为容器指定了这些变量,则应包含在 message 中。
env-regex自选与 类似并兼容。用于匹配与日志记录相关的环境变量的正则表达式。用于高级日志标记选项env

如果 and 选项之间发生冲突,则 the 的值优先。每个选项都会向 logging 消息。labelenvenv

以下是记录到 journald 所需的日志记录选项的示例。

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

此配置还指示驱动程序在有效负载中包含标签 location 和环境变量 .如果省略 or 参数,则相应的键将 未在 journald log 中设置。TEST--env "TEST=false"--label location=west

关于容器名称的注意事项

字段中记录的值是容器的名称,该容器 在启动时设置。如果您用于重命名容器,则新的 name 不会反映在 journal entries 中。日记条目继续 以使用原始名称。CONTAINER_NAMEdocker rename

使用 journalctl 检索日志消息

使用命令检索日志消息。您可以应用过滤器 表达式将检索到的消息限制为与特定 容器:journalctl

$ sudo journalctl CONTAINER_NAME=webserver

您可以使用其他筛选条件来进一步限制检索的消息。该标志仅检索自上次系统引导以来生成的消息:-b

$ sudo journalctl -b CONTAINER_NAME=webserver

该标志指定检索到的日志消息的格式。用于以 JSON 格式返回日志消息。-o-o json

$ sudo journalctl -o json CONTAINER_NAME=webserver

查看启用了 TTY 的容器的日志

如果在容器上启用了 TTY,您可能会在输出中看到 检索日志消息时。 这样做的原因是它被附加到行尾,除非设置,否则不会自动剥离它:[10B blob data]\rjournalctl--all

$ sudo journalctl -b CONTAINER_NAME=webserver --all

使用日志 API 检索日志消息

此示例使用 Python 模块检索容器 原木:systemd

import systemd.journal

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

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