繁体   English   中英

将 docker-compose 日志保存到文件

[英]Save docker-compose logs to a file

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

我想要相当于:

docker-compose logs > logs.txt

编辑 - 澄清:

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

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

我不确定你想要达到什么目的。 你想重现吗

docker-compose logs > logs.txt

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

稍后,您可以执行以下操作:

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

或者

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

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

在以后的 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

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

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

尝试:

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

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

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

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

我需要从我的 nginx 容器和docker-compose logs --tail 1000000 nginx > last1mio.log转储最后 1MIO 记录太慢并且输出与通常的 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 实用程序来解析 json - 使用一些特殊选项来获得与原始 nginx 日志文件通常具有的格式相同的格式。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM