【问题标题】:View logs for all docker containers simultaneously同时查看所有 docker 容器的日志
【发布时间】:2016-04-20 23:04:53
【问题描述】:

我目前使用 docker 作为我的后端,当我第一次启动它们时

docker-compose up

我一次得到所有 4 个 docker 的日志输出,所以当请求进来时我可以看到它们是如何相互交互的。看起来像这样,一个请求从 nginx 到 couchdb

现在的问题是我在 GCE 上运行负载平衡,当一个新的 VM 启动时,它会自动启动 docker 并正常运行,我希望能够访问负载平衡的 VM 并查看实时日志,但我无法让 docker 允许我使用这种样式,当我使用日志时,它给了我正常的全白色字体,没有它来自哪里的标签。

使用

docker events  

什么都不做,它不会返回任何信息。

tldr;获取视图的最佳方式是什么,与运行“docker-compose up”时获得的日志输出相同

【问题讨论】:

  • docker events 不是您想要的。它返回一个 docker 引擎事件流,例如创建、启动、停止和删除容器(等等)。 docker events 不处理每个容器内的日志。您可以尝试制作一个使用 docker 远程 API 的小型应用程序:docs.docker.com/engine/reference/api/docker_remote_api_v1.23/…。或者您可以使用已经可用于收集 docker 日志的工具之一:docs.docker.com/engine/admin/logging/overview
  • @JamesStewy 似乎应该有一种简单的方法来启用日志记录,就像在启动期间一样。可能需要查看其他日志记录选项。

标签: docker docker-compose


【解决方案1】:

如果使用 docker-compose,则使用

docker-compose logs --tail=0 --follow

而不是

docker logs --tail=0 --follow

这将得到我最初寻找的输出。

【讨论】:

  • 但这需要 docker-compose.yml,我有 4 个,并且想将它们全部附加...
  • @phazei 为什么不将所有 docker 信息放在一个 docker-compose.yml 中?
  • 如果你发现这没有输出预期的结果(例如,命令退出并且没有遵循或显示非常过时的日志条目)检查你是否正在使用 Docker 项目,即。使用 -p 标志启动容器。如果您使用 -p 启动它们,则需要将 -p 添加到您的日志命令中: docker-compose -p logs --tail 10 --follow
【解决方案2】:

您可以查看所有正在运行的容器的日志

docker ps -q | xargs -L 1 docker logs

理论上,如果 xargs 与 -P <count> 一起运行,这可能也适用于 --follow,其中计数高于运行容器的数量。

【讨论】:

  • 正在关注多个容器日志,例如:docker ps -q | xargs -L 1 -P `docker ps | wc -l` docker logs --since 30s -f
【解决方案3】:

我使用它的一个变体来跟踪(--follow)所有日志并指示当时哪个日志正在拖尾。这个 bash 包括标准输出和标准错误。请注意,之后您可能需要清除 *.{log,err} 的 /tmp 目录。

for c in $(docker ps -a --format="{{.Names}}")
do
       docker logs -f $c > /tmp/$c.log 2> /tmp/$c.err &
done
tail -f /tmp/*.{log,err}

希望这会有所帮助。这些天伐木变得如此成问题,还有其他下车的我的草坪老人咆哮......

【讨论】:

  • 这个脚本很棒,真的让我很开心。我只能推荐使用它!为简单起见 +1
【解决方案4】:

试试“看”

这是一个用于 docker 容器的快速而肮脏的 multitail/xtail。

# watch 'docker ps --format "{{.Names}}" | sort | xargs --verbose --max-args=1 -- docker logs --tail=8 --timestamps'

根据需要调整参数“--tail=8”,使所有内容仍适合一个屏幕。

当容器停止并重新启动时,上面列出的“xargs”方法将停止工作。这里的这种“监视”方法没有那个问题。 (但也不是很好。)

【讨论】:

    【解决方案5】:

    如果您使用的是 Docker Swarm,您可以通过

    找到您的服务
    docker service ls
    

    获取id,然后运行

    docker service logs $ID -f 
    

    如果服务是使用 tty: true 定义的,那么您必须使用 --raw 标志运行。请注意,这不会告诉您哪个容器正在提供输出的日志条目。

    【讨论】:

      最近更新 更多