Docker - 如何查看运行在Docker容器中的应用程序日志?

8

我有一个Node.js应用程序运行在Docker容器中的/usr/src/app目录下。

我想使用nohup来运行这个应用程序(nohup node index.js &)。

为了一般/调试目的,查看追加到nohup.out的输出最好的方法是什么?

我需要一直使用docker cp复制到主机操作系统吗?有更好的方法来实现这个吗?

谢谢。


1
为什么需要使用nohup? - jsalonen
@jsalonen,我知道我可以简单地运行node index.js并使用docker logs来查看stdout的输出,但我很好奇如何查看日志文件,以防输出被写入到日志文件中。 - madcolonel10
nohup会写入日志文件吗?你的日志文件叫什么名字? - jsalonen
它会将内容写入到 nohup.out 文件中。 - madcolonel10
2个回答

10

虽然在容器内使用日志文件(不挂载卷)是一种反模式,但您可以轻松地使用exec等命令输出这些文件,例如与cat一起使用:

docker exec -it [CONTAINERID] cat /usr/src/app/nohup.out

更好的做法是将输出存储到单独的挂载卷文件夹中,从容器内部移除状态,同时也可以允许您直接从主机系统访问日志。
在这种特定情况下,我不认为需要单独的日志文件,甚至不需要 nohup。只需将容器策略设置为自动重启(--restart always),而不是使用 nohup。

反模式链接已经失效。 - Chris
已删除失效链接。 - jsalonen
使用以下命令:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]始终使用CONTAINER(任务ID),而不是服务名称。我们可以使用任何*nix命令作为COMMAND。ls将显示容器工作目录中的文件列表。 - chanduthedev

5

你需要将日志输出到

/dev/stdout 用于所有普通日志

如果您的应用程序可以区分普通日志和错误日志,则使用 /dev/stderr 管道传输所有错误。

因此,您定义日志文件时不再像 /var/log/nohup.log 那样定义,而是定义为 dev/stdout

访问日志就像编写 docker logs <containername>docker-compose logs <servicename> 一样容易 - 如果您使用 docker-compose up 启动了栈,您将直接看到日志 - 非常方便。

在生产环境中,您需要进一步处理日志流,请查看https://github.com/gliderlabs/logspout

如果您想更深入地了解,可以将ELK堆栈添加到其中https://logz.io/learn/complete-guide-elk-stack/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接