将 docker-compose 日志保存到文件
Save docker-compose logs to a file
我在我的构建服务器上进行了单元测试 运行ning 并希望在出现问题时捕获日志结果以供分析。我还没有找到一种方法将 docker-compose logs
的输出重定向到一个文件,或者找到日志文件本身实际存在的位置。
我想要相当于:
docker-compose logs > logs.txt
编辑 - 澄清:
我的所有 docker 容器都会生成有用的日志,docker-compose logs
的手册 运行 揭示了这些日志。我想编写此过程的脚本以将这些相同的日志保存到一个文件中,该文件是我的构建服务器上的一个工件。本质上,docker-compose logs
的输出保存到文件中,但是 docker-compose logs
永远不会退出。
我不确定你想要达到什么目的。您是否正在尝试重现
docker-compose logs > logs.txt
在撰写文件中作为指令?或者您的问题是重定向没有 "catch" 整个输出?
以后可以做:
docker-compose logs --no-color >& logs.txt
或
docker-compose logs --no-color |& tee logs.txt
同时在终端上查看日志并将其转储到文件中。
默认情况下 docker 使用 json-file
驱动程序来记录您的容器日志,日志的原始 json 输出可以在以下位置找到:
/var/lib/docker/containers/[container-id]/[container-id]-json.log
您可以通过 运行ning 获取此位置:
docker inspect --format='{{.LogPath}}' [container-id or container-name]
当你运行docker-compose logs [service-name]
时,docker-compose
会附加到你引用的服务(容器)上,LogPrinter对象会输出上面文件的内容,但格式化后更易于阅读。
在以后的版本docker-compose 1.7.x+中,它被修复了。见 https://github.com/docker/compose/issues/2227 & https://github.com/docker/compose/releases/tag/1.7.0
在此之前,还有另一种实现方式,接受答案的解决方案是直接访问主机文件,这可能不适用于remote/security情况。
下面我们可以通过docker-compose ps
命令获取容器名称,让docker logs
命令循环
docker-compose ps | tail -n +3 | awk '{print }' | xargs -n1 docker logs
docker-compose logs
命令 会 终止(除非您添加 --follow
设置)。
这里可能的问题是日志太大,需要一些时间来格式化和输出它们。如果通过指定 either/both 要读取的行数和要从中读取的容器来限制输出,则可以减少此问题。
尝试:
docker-compose logs --no-color --tail=1000 <service-name> > logs.txt
注意:
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
备注:
- 你需要知道你的容器名称,在我的例子中是
nginx-1
- 我使用 docker-compose 选项 container_name:
来获得这个常量
- 我正在使用 JQ utility 来解析 json - 使用一些特殊选项来获得与原始 nginx 日志文件通常具有的格式相同的格式。
在我的例子中,转储 nginx 日志的最后 1mio 行需要 cca 10s。
要查看容器的日志在哪里,我们使用 docker 检查。
docker inspect --format={{.LogPath}} <container id>
这将为您提供保存日志的 json 文件的路径。
就我而言 /var/lib/docker/containers/xxxx
然后我去那里可以复制 json 文件。
奇怪的是我只有最后两周的日志。有什么办法可以得到更多?
在我的例子中,docker 默认使用 journald
而我的 LogPath
是空白的。
我在我的 docker-compose 中添加了以下内容,然后查看了一个日志:
logging:
driver: "json-file"
查看日志:
CONTNAME=
docker inspect --format='{{.LogPath}}' $CONTNAME | xargs tail -f
我在我的构建服务器上进行了单元测试 运行ning 并希望在出现问题时捕获日志结果以供分析。我还没有找到一种方法将 docker-compose logs
的输出重定向到一个文件,或者找到日志文件本身实际存在的位置。
我想要相当于:
docker-compose logs > logs.txt
编辑 - 澄清:
我的所有 docker 容器都会生成有用的日志,docker-compose logs
的手册 运行 揭示了这些日志。我想编写此过程的脚本以将这些相同的日志保存到一个文件中,该文件是我的构建服务器上的一个工件。本质上,docker-compose logs
的输出保存到文件中,但是 docker-compose logs
永远不会退出。
我不确定你想要达到什么目的。您是否正在尝试重现
docker-compose logs > logs.txt
在撰写文件中作为指令?或者您的问题是重定向没有 "catch" 整个输出?
以后可以做:
docker-compose logs --no-color >& logs.txt
或
docker-compose logs --no-color |& tee logs.txt
同时在终端上查看日志并将其转储到文件中。
默认情况下 docker 使用 json-file
驱动程序来记录您的容器日志,日志的原始 json 输出可以在以下位置找到:
/var/lib/docker/containers/[container-id]/[container-id]-json.log
您可以通过 运行ning 获取此位置:
docker inspect --format='{{.LogPath}}' [container-id or container-name]
当你运行docker-compose logs [service-name]
时,docker-compose
会附加到你引用的服务(容器)上,LogPrinter对象会输出上面文件的内容,但格式化后更易于阅读。
在以后的版本docker-compose 1.7.x+中,它被修复了。见 https://github.com/docker/compose/issues/2227 & https://github.com/docker/compose/releases/tag/1.7.0
在此之前,还有另一种实现方式,接受答案的解决方案是直接访问主机文件,这可能不适用于remote/security情况。
下面我们可以通过docker-compose ps
命令获取容器名称,让docker logs
命令循环
docker-compose ps | tail -n +3 | awk '{print }' | xargs -n1 docker logs
docker-compose logs
命令 会 终止(除非您添加 --follow
设置)。
这里可能的问题是日志太大,需要一些时间来格式化和输出它们。如果通过指定 either/both 要读取的行数和要从中读取的容器来限制输出,则可以减少此问题。
尝试:
docker-compose logs --no-color --tail=1000 <service-name> > logs.txt
注意: 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
备注:
- 你需要知道你的容器名称,在我的例子中是
nginx-1
- 我使用 docker-compose 选项container_name:
来获得这个常量 - 我正在使用 JQ utility 来解析 json - 使用一些特殊选项来获得与原始 nginx 日志文件通常具有的格式相同的格式。
在我的例子中,转储 nginx 日志的最后 1mio 行需要 cca 10s。
要查看容器的日志在哪里,我们使用 docker 检查。
docker inspect --format={{.LogPath}} <container id>
这将为您提供保存日志的 json 文件的路径。
就我而言 /var/lib/docker/containers/xxxx
然后我去那里可以复制 json 文件。
奇怪的是我只有最后两周的日志。有什么办法可以得到更多?
在我的例子中,docker 默认使用 journald
而我的 LogPath
是空白的。
我在我的 docker-compose 中添加了以下内容,然后查看了一个日志:
logging:
driver: "json-file"
查看日志:
CONTNAME=
docker inspect --format='{{.LogPath}}' $CONTNAME | xargs tail -f