将docker-compose日志保存到文件中

Rya*_*yan 38 logging docker docker-compose

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

我想要相当于:

docker-compose logs > logs.txt
Run Code Online (Sandbox Code Playgroud)

编辑 - 澄清:

我的所有docker容器都会生成有用的日志,这些日志是手动docker-compose logs显示的.我想编写此过程的脚本,将这些相同的日志保存到我的构建服务器上的工件文件中.从本质上讲,docker-compose logs保存到文件的输出docker-compose logs永远不会退出.

Chr*_*nel 45

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

/var/lib/docker/containers/[container-id]/[container-id]-json.log
Run Code Online (Sandbox Code Playgroud)

您可以通过运行获取此位置:

docker inspect --format='{{.LogPath}}' [container-id or container-name]
Run Code Online (Sandbox Code Playgroud)

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

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


cre*_*ack 19

我不确定你想要实现的目标.你想重现吗?

docker-compose logs > logs.txt
Run Code Online (Sandbox Code Playgroud)

在compose文件中作为指令?或者你的问题是重定向没有"捕获"整个输出?

在后面,您可以这样做:

docker-compose logs --no-color >& logs.txt
Run Code Online (Sandbox Code Playgroud)

要么

docker-compose logs --no-color |& tee logs.txt
Run Code Online (Sandbox Code Playgroud)

既可以查看终端上的日志,又可以同时将其转储到文件中.

  • 键入`docker-compose logs`开始流式传输日志输出,对吧?我基本上想要将所有输出转储到文件中.我提出的命令的问题是`docker-compose logs`没有终止,因此它不会将输出重定向到文件. (2认同)
  • 我想我可以做一些粗略的事情,例如:docker-compose logs>&log.txt&(注意背景为&),然后是sleep 5;docker-compose stop;`但是我希望少一点草率的东西。 (2认同)

Mat*_*son 9

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

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

尝试:

docker-compose logs --no-color --tail=1000 <service-name> > logs.txt
Run Code Online (Sandbox Code Playgroud)

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

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


Rob*_*ujo 7

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

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

这是适合我的解决方案:

docker inspect --format='{{.LogPath}}' nginx-1 \
| xargs tail -n 1000000 \
| jq -r -j .log > last1mio.log 2>&1
Run Code Online (Sandbox Code Playgroud)

笔记:

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

在我的例子中,转储 nginx 日志的最后 1mio 行需要 cca 10 秒。

  • 这是一个聪明的答案,但在 Ubuntu 上默认情况下确实需要“su”权限,因为日志目录只能由 root 读取。 (2认同)

Lar*_*Cai 6

在后来发布的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
Run Code Online (Sandbox Code Playgroud)