【问题标题】:Save docker-compose logs to a file将 docker-compose 日志保存到文件
【发布时间】:2016-05-26 15:58:52
【问题描述】:

我在构建服务器上运行了单元测试,并希望在出现故障时捕获日志结果以进行分析。我还没有找到将docker-compose logs 的输出重定向到文件的方法,或者找到日志文件本身实际存在的位置。

我想要相当于:

docker-compose logs > logs.txt

编辑 - 澄清:

我所有的 docker 容器都会产生有用的日志,手动运行 docker-compose logs 会显示这些日志。我想编写此过程的脚本,以将这些相同的日志保存到作为我的构建服务器上的工件的文件中。本质上,docker-compose logs 的输出保存到一个文件中,但是docker-compose logs 永远不会退出。

【问题讨论】:

  • 命令“docker-compose logs”确实退出了。但它似乎并不包含所有日志。

标签: logging docker docker-compose


【解决方案1】:

我不确定您要达到的目标。你是想复制吗

docker-compose logs > logs.txt

在撰写文件中作为指令?还是您的问题是重定向没有“捕获”整个输出?

在后面,你可以这样做:

docker-compose logs --no-color >& logs.txt

或者

docker-compose logs --no-color |& tee logs.txt

同时查看终端上的日志并将其转储到文件中。

【讨论】:

  • 输入docker-compose logs 开始流式传输日志输出,对吗?我基本上想将所有输出转储到文件中。我提出的命令的问题是docker-compose logs 不会终止,因此它不会将输出重定向到文件。
  • 日志是一个流,重定向在接收数据时填充文件。你的文件坚持0字节?使用 >& 而不是 > 是否也能做到这一点?
  • 您的建议确实有效(他们用我的日志填充 logs.txt),但该命令永远不会返回,因为 docker-compose logs 会无限期运行。
  • 如果您运行docker-compose logs,该命令会自行退出吗?
  • 我想我可以做一些有点粗俗的事情,比如:docker-compose logs >& log.txt &(注意& 作为背景),然后是sleep 5; docker-compose stop;,但我希望做一些不那么草率的事情。
【解决方案2】:

默认情况下,docker 使用json-file 驱动程序来记录您的容器日志,日志的原始 json 输出可以在以下位置找到:

/var/lib/docker/containers/[container-id]/[container-id]-json.log

你可以通过运行得到这个位置:

docker inspect --format='{{.LogPath}}' [container-id or container-name]

当您运行docker-compose logs [service-name] 时,docker-compose 将附加到您引用的服务(容器),LogPrinter 对象将输出上述文件的内容,但已格式化以便更易于阅读。

相关文档:https://docs.docker.com/compose/compose-file/#logging

【讨论】:

  • 我在那里看不到任何 *-json.log,我应该先停止容器吗?
  • 第二个命令似乎没有按预期工作,因为它导致 Windows 机器上出现以下错误消息:Template parsing error: template: :1:2: executing "" at <.LogPath>: map has no entry for key "LogPath"
【解决方案3】:

在更高版本的 docker-compose 1.7.x+ 中,它已被修复。见https://github.com/docker/compose/issues/2227 & https://github.com/docker/compose/releases/tag/1.7.0

在此之前,还有另一种实现方式,接受答案的解决方案是直接访问主机文件,这可能不适用于远程/安全情况。

下面我们可以通过docker-compose ps命令获取容器名,让docker logs命令循环

docker-compose ps | tail -n +3 | awk '{print $1}' | xargs -n1 docker logs

【讨论】:

    【解决方案4】:

    docker-compose logs 命令 终止(除非您添加 --follow 设置)。

    这里可能的问题是日志太大,需要一些时间来格式化和输出它们。如果您通过指定要读取的行数和要从中读取的容器中的一个/两个来限制输出,则可以减少此问题。

    试试:

    docker-compose logs --no-color --tail=1000 <service-name> > logs.txt
    

    注意: service-name 是取自 docker-compose 文件的服务名称 - 不是容器名称或容器 ID

    (根据需要调整尾号。我添加了“--no-color”以简化输出但不需要。)

    【讨论】:

    • 更新:这已在 Docker-compose 1.7 中修复。 (见@larry-cai 回答)
    【解决方案5】:

    我提出的解决方案基于 Chris McKinnel 的回答,并进行了一些改进。

    我需要从我的 nginx 容器中转储最后 1MIO 记录,而docker-compose logs --tail 1000000 nginx &gt; last1mio.log 太慢了,并且输出与通常的 nginx 文件不完全相同。

    这是适合我的解决方案:

    docker inspect --format='{{.LogPath}}' nginx-1 \
    | xargs tail -n 1000000 \
    | jq -r -j .log > last1mio.log 2>&1
    

    注意事项:

    • 你需要知道你的容器名称,在我的例子中是 nginx-1 - 我使用 docker-compose 选项 container_name: 来获得这个常量
    • 我正在使用JQ utility 解析 json - 使用一些特殊选项来获得与原始 nginx 日志文件通常具有的格式相同的格式。

    在我的情况下,nginx 日志的最后 1mio 行的转储需要 cca 10s。

    【讨论】:

    • 这是一个聪明的答案,但它在 Ubuntu 上默认需要 su 权限,因为日志目录只能由 root 读取。
    【解决方案6】:

    要查看容器的日志在哪里,我们使用 docker inspect。

    docker inspect --format={{.LogPath}} <container id>
    

    这将为您提供保存日志的 json 文件的路径。

    在我的情况下/var/lib/docker/containers/xxxx

    然后我去那里复制json文件。

    奇怪的是我只有最后两周的日志。有没有办法获得更多?

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 1970-01-01
      • 2019-03-28
      • 2019-09-08
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多