0

我有一个 systemd 服务文件,它运行一个带有日志驱动程序日志的 docker 容器。

ExecStart=/usr/bin/docker run \
    --name ${CONTAINER_NAME} \
    -p ${PORT}:8080 \
    --add-host ${DNS} \
    -v /etc/localtime:/etc/localtime:ro \
    --log-driver=journald \
    --log-opt tag="docker.{{.Name}}" \
    ${RESPOSITORY_NAME}/${CONTAINER_NAME}

ExecStop=-/usr/bin/docker stop ${CONTAINER_NAME}

当我通过 journalctl 检查日志时,我看到两个不同的_TRANSPORT。使用journalctl -u test.service我看到_TRANSPORT=stdout。随着Journalctl CONTAINER_NAME=test我看到_TRANSPORT=journal

有什么区别?

4

1 回答 1

0

这里的区别在于日志systemd-journald在被记录之前如何到达。

截至目前,支持的传输(至少根据 中的_TRANSPORT字段systemd-journald)是:审计、驱动程序、系统日志、日志、标准输出内核(参见systemd.journal-fields(7))。

在您的情况下,stdoutExecStart=andExecStop=指令执行的命令记录的所有内容都记录在_TRANSPORT=stdout传输下。

但是,Docker 在内部能够使用journald 日志记录驱动程序,其中引入了几个自定义日志字段 - 其中之一是CONTAINER_ID=. 这只是将数据传递到的另一种方法systemd-journald- 而不是依赖 systemd 捕获并将所有内容从 stdout 发送到systemd-journald,Docker 在内部将所有内容直接发送到systemd-journald它自己。

这可以通过使用sd-journalAPI 来实现(如sd-journal(3)中所述)。Docker为C 库使用go-systemd Go 绑定。sd-journal

简单的例子:

hello.c

#include <stdio.h>
#include <systemd/sd-journal.h>

int main(void)
{
    printf("Hello from stdout\n");
    sd_journal_print(LOG_INFO, "Hello from journald");

    return 0;
}
# gcc -o /var/tmp/hello -lsystemd hello.c
# cat > /etc/systemd/system/hello.service << EOF
[Service]
ExecStart=/var/tmp/hello
EOF

# systemctl daemon-reload
# systemctl start test.service

现在,如果我查看日志,我会看到两条消息:

# journalctl -u hello.service
-- Logs begin at Mon 2019-09-30 22:08:02 CEST, end at Fri 2020-03-27 17:11:29 CET. --
Mar 27 17:08:28 localhost systemd[1]: Started hello.service.
Mar 27 17:08:28 localhost hello[921852]: Hello from journald
Mar 27 17:08:28 localhost hello[921852]: Hello from stdout
Mar 27 17:08:28 localhost systemd[1]: hello.service: Succeeded.

但是他们每个人都使用不同的交通工具到达:

# journalctl -u hello.service _TRANSPORT=stdout
-- Logs begin at Mon 2019-09-30 22:08:02 CEST, end at Fri 2020-03-27 17:12:29 CET. --
Mar 27 17:08:28 localhost hello[921852]: Hello from stdout
# journalctl -u hello.service _TRANSPORT=journal
-- Logs begin at Mon 2019-09-30 22:08:02 CEST, end at Fri 2020-03-27 17:12:29 CET. --
Mar 27 17:08:28 localhost systemd[1]: Started hello.service.
Mar 27 17:08:28 localhost hello[921852]: Hello from journald
Mar 27 17:08:28 localhost systemd[1]: hello.service: Succeeded.
于 2020-03-27T15:52:52.897 回答