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 | 可选 | 逗号分隔的环境变量键列表,如果为容器指定了这些变量,则应将其包含在消息中。 |
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
此配置还指示驱动程序在 payload 中包含 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
被附加到行尾,而 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)