gpt4 book ai didi

docker - 容器日志记录如何工作?

转载 作者:行者123 更新时间:2023-12-02 12:01:22 28 4
gpt4 key购买 nike

我在很多 docker 容器中看到,创建日志文件并像这样记录日志是一种常见的做法

/var/log/container.log
...

tail -f /var/log/container.log

不知何故,输出似乎是由容器运行时日志驱动程序获取的。所以如果我跑
docker container logs container

这将显示文件 container.log 的输出。

我知道任何容器的最佳实践是登录 stdoutstderr ,但我不明白为什么第一个选项有效(创建一个文件并在其上运行tail)。是因为 tail 的输出吗?由驱动程序日志获取并将其与标准输出的内容合并?

非常感谢您的帮助。
谢谢。

最佳答案

tail -f方法并不是真正的最佳实践。

正如您所注意到的,运行进程并生成日志的正确方法是将其输出直接写入 stdout 和 stderr,以及 docker logs将捕获它们。您可以配置 Docker 的日志记录层以将它们发送到其他地方;如果你迁移到像 Kubernetes 这样的集群基础设施,你可以配置它的日志层来捕获日志,而无需修改你的应用程序代码。

#!/bin/sh
# I am the script that runs the main container process.
# Run a single process, as a foreground process; when that
# process ends, the container exits.
exec some_server --no-daemon --log-file /dev/stdout

当你看到 tail -f它通常看起来像这样:

#!/bin/sh
# Start something as a background process.
something --log-file /var/log/something.log &
# Hackily keep the container from exiting.
tail -f /var/log/something.log

主容器进程是 tail过程。当 tail退出,容器将停止,如果您 docker stop容器,信号将转到 tail .哦,顺便说一下,作为副作用,有一个 something进程正在运行,但如果它失败了,Docker 无法注意到它。尽管如此,自从 tail进程是主进程, tail -f永远不会退出,这会保持容器运行,并且它会使其基于文件的日志对容器的标准输出可见。

另一个有趣的方法是 Docker Hub httpd image 可以:它将日志设置为指向一个文件,但该文件的默认内容是指向 /dev/stdout 的符号链接(symbolic link)。 .

RUN mkdir /var/log/something \
&& ln -s /dev/stdout /var/log/something/something.log
CMD ["something", "--log-file", "/var/log/something/something.log"]

这很有趣,因为默认行为是将内容写入该日志文件,但实际上是 /dev/stdout特殊设备,因此它将转到进程的标准输出(主容器进程)。如果你想在文件中捕获它,你可以绑定(bind)挂载你自己的目录到 /var/log/something这将阻碍符号链接(symbolic link)。

关于docker - 容器日志记录如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61505522/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com