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命令确实终止(除非您添加--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”来简化输出,但不需要。)
我提出的解决方案基于 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:来拥有这个常量在我的例子中,转储 nginx 日志的最后 1mio 行需要 cca 10 秒。
在后来发布的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)
| 归档时间: |
|
| 查看次数: |
42705 次 |
| 最近记录: |