【问题标题】:How to see the logs of a docker container如何查看 docker 容器的日志
【发布时间】:2018-05-29 11:41:07
【问题描述】:

我有一个简单的代码,我为它创建了一个 docker 容器,状态显示它运行良好。在代码中,我使用了一些print() 命令来打印数据。我想看看那个打印命令的输出。

为此,我看到了 docker logs 。但它似乎没有工作,因为它没有显示任何日志。如何查看日志?

 $ sudo docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                            NAMES
a3b3fd261b94        myfirstdocker                     "python3 ./my_script…"   22 minutes ago      Up 22 minutes                                                        elegant_darwin

 $ sudo docker logs a3b3fd261b94
 <shows nothing>

【问题讨论】:

  • 尝试在您的问题中添加更多信息,以帮助我们重现问题。理想的情况是提供Minimal, Complete, and Verifiable example
  • @tgogos 我添加了更多信息
  • 你必须让它更多complete :-)。正如它在相关部分中所说:" - 有些人可能准备加载这些部分,并实际尝试他们来测试他们即将发布的答案。 - 问题可能不在您怀疑的部分它是,但完全是另一部分。”

标签: docker logging


【解决方案1】:

您需要将日志打印到stdout

要检查 docker 日志,只需使用以下命令:

docker logs --help

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --help           Print usage
      --since string   Show logs since timestamp
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps

一些例子:

docker logs --since=1h <container_id>

【讨论】:

  • 我有一个 python 代码,里面我使用了print()。我希望stdoutprint() 一样
  • 是的,你是对的。 print() 将输出发送到 stdout
  • @SAndrew 我遇到了同样的问题。你能解决这个问题吗?
  • @Gopi 而不是print(),我使用python日志模块将我的日志保存在文件中,然后我可以看到日志
  • 好的,谢谢。我会尝试同样的方法。但我看到当我们做docker logs -f &lt;container&gt; 时,一段时间后会打印日志。我认为 docker 中有缓冲区并定期打印日志。
【解决方案2】:

如果没有太多假设的输出(例如脚本只是尝试打印几个字节),我怀疑 python 正在缓冲它。

尝试在输出中添加更多数据以确保缓冲区已刷新,并使用 PYTHONUNBUFFERED=1(尽管尽管有此设置,python3 仍可能会进行一些缓冲)。

【讨论】:

    【解决方案3】:

    4

    让我们尝试使用 docker create start 然后再次记录命令,看看会发生什么。

    sudo docker create busybox echo hi there

    命令的输出

    现在我将获取 ID 并运行 docker start 并粘贴启动容器的 ID,它在其中执行 echo high ,然后立即退出。

    现在我想回到那个停止的容器并获取它内部发出的所有日志。 为此,我可以在 docker logs 上运行,然后将 ID 粘贴进去,我会看到当容器运行时它打印出字符串 Hi there

    要真正清楚的一点是,通过运行 docker logs,我并没有以任何方式重新运行或重新启动容器,我只是得到了所有已发出的日志的记录。容器。 docker 日志 container_id

    【讨论】: