我在构建服务器上运行了单元测试,并希望在出现故障时捕获日志结果以进行分析。我还没有找到一种方法将docker-compose logs
的输出重定向到文件,或找到日志文件本身实际存在的位置。
我想要相当于:
docker-compose logs > logs.txt
编辑 - 澄清:
我的所有docker容器都会生成有用的日志,这些日志会显示docker-compose logs
的手动运行。我想编写此过程的脚本,将这些相同的日志保存到我的构建服务器上的工件文件中。基本上,docker-compose logs
的输出已保存到文件中,但docker-compose logs
永远不会退出。
答案 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对象将输出上述文件的内容,但已格式化,因此它们是更容易阅读。
答案 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:
来获得此常量在我的情况下,nginx日志的最后1mio行的转储需要大约10s的时间。
答案 5 :(得分:0)
要查看容器的日志在哪里,我们使用docker inspect。
docker inspect --format={{.LogPath}} <container id>
这将为您提供保存日志的json文件的路径。
在我的情况下/var/lib/docker/containers/xxxx
然后我去那里,可以复制json文件。
奇怪的是,我只有最后两周的日志。有什么办法获得更多?