更多文章:WorkMap技术博客
journald日志驱动程序将容器日志发送到systemd journal。可以使用journalctl命令、journal API或docker logs命令查看日志。
除了日志记录本身的文本外,journald日志驱动程序还存储了以下元数据:
-
CONTAINER_ID
容器ID的前12个字符。
-
CONTAINER_ID_FULL
完整的64个字符的容器ID。
-
CONTAINER_NAME
容器启动时的名称。如果使用docker rename重命名容器,则日志条目中不会反映新名称。
-
CONTAINER_TAG,SYSLOG_IDENTIFIER
容器标记。
-
CONTAINER_PARTIAL_MESSAGE
用于标志日志完整性的字段。优化长日志行的显示。
使用方法
- 修改daemon.json
Linux:/etc/docker/
Windows Server:C:\ProgramData\docker\config\daemon.json{ “log-driver”:“journald”, }
- 重新启动 Docker 以使新创建的容器生效更改。现有容器不使用新的日志配置。
- 创建容器,使用指定的日志驱动
docker run \ --log-driver=journald \ --log-opt labels=location \ --log-opt env=TEST \ --env "TEST=false" \ --label location=west \ your/application
参数
-
tag
可选
附加到日志消息中CONTAINER_TAG和SYSLOG_IDENTIFIER字段。
-
labels
可选
启动Docker守护程序时添加。可以作为容器元数据,由日志驱动程序读取,配置自定义日志格式。
-
labels-regex
可选
和labels类似的功能。
-
env
可选
启动Docker守护程序时添加。作为容器元数据,由日志驱动程序读取,配置自定义日志格式。
-
env-regex
可选
和env类似,用于匹配与日志记录相关的环境变量的正则表达式。
关于容器名称的注意事项
记录在CONTAINER_NAME字段中的值是在启动时设置的容器名称。如果使用docker rename重命名容器,Journal条目继续使用原始名称。
使用journalctl检索日志消息
- 使用journalctl命令检索日志。
sudo journalctl CONTAINER_NAME = webserver
- 使用-b过滤器,限制检索到的日志。-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不会自动strip,除非设置–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)