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

时间:2016-02-15 16:36:54

标签: logging docker docker-compose

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

我想要相当于:

docker-compose logs > logs.txt

编辑 - 澄清:

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

6 个答案:

答案 0 :(得分:41)

默认情况下,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

答案 1 :(得分:17)

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

docker-compose logs > logs.txt

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

在后面,你可以这样做:

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

或者

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

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

答案 2 :(得分: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

答案 3 :(得分:1)

<IfVersion >= 2.4.7 > Header always setifempty X-Frame-Options "ALLOW-FROM https://example.com" </IfVersion> <IfVersion < 2.4.7 > Header always merge X-Frame-Options "ALLOW-FROM https://example.com" </IfVersion> 命令终止(除非您添加docker-compose logs设置)。

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

尝试:

--follow

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

答案 4 :(得分:0)

我提出的解决方案基于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

注意:

  • 您需要知道您的容器名称,在我的情况下是nginx-1-我使用docker-compose选项container_name:来获得此常量
  • 我正在使用JQ utility来解析json-并提供一些特殊选项来获得与原始nginx日志文件通常相同的格式。

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

答案 5 :(得分:0)

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

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

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

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

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

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