Logging 将docker compose日志保存到文件
我在构建服务器上运行单元测试,并希望在出现故障时捕获日志结果进行分析。我还没有找到将docker compose logs的输出重定向到文件的方法,或者找到日志文件本身的实际位置 我想要相当于:Logging 将docker compose日志保存到文件,logging,docker,docker-compose,Logging,Docker,Docker Compose,我在构建服务器上运行单元测试,并希望在出现故障时捕获日志结果进行分析。我还没有找到将docker compose logs的输出重定向到文件的方法,或者找到日志文件本身的实际位置 我想要相当于: docker-compose logs > logs.txt 编辑-澄清: 我所有的docker容器都会生成有用的日志,手动运行docker compose日志可以显示这些日志。我想编写这个过程的脚本,将这些相同的日志保存到一个文件中,该文件是构建服务器上的工件。基本上,docker comp
docker-compose logs > logs.txt
编辑-澄清:
我所有的docker容器都会生成有用的日志,手动运行
docker compose日志可以显示这些日志。我想编写这个过程的脚本,将这些相同的日志保存到一个文件中,该文件是构建服务器上的工件。基本上,docker compose logs
的输出保存到一个文件中,但是docker compose logs
从不存在。我不确定您想要实现什么。你在试图复制吗
docker-compose logs > logs.txt
在编写文件中作为指令?或者您的问题是重定向没有“捕获”整个输出
在后面的步骤中,您可以执行以下操作:
docker-compose logs --no-color >& logs.txt
或
同时查看终端上的日志并将其转储到文件。默认情况下,docker使用json文件
驱动程序记录容器日志,日志的原始json输出可在以下位置找到:
/var/lib/docker/containers/[container-id]/[container-id]-json.log
您可以通过运行以下命令获取此位置:
docker inspect --format='{{.LogPath}}' [container-id or container-name]
当您运行docker compose logs[服务名称]
时,docker compose
将附加到您引用的服务(容器),对象将输出上述文件的内容,但其格式应便于阅读
相关文档:在后续版本docker compose 1.7.x+中,它是固定的。见,
在此之前,还有另一种实现方法,公认的解决方案是直接访问主机文件,这可能不适用于远程/安全情况
下面我们可以从docker compose ps
命令中获取容器名称,并让docker日志
命令循环
docker-compose ps | tail -n +3 | awk '{print $1}' | xargs -n1 docker logs
docker compose logs
命令不会终止(除非添加--follow
设置)
这里可能存在的问题是日志太大,格式化和输出它们需要一些时间。如果通过指定要读取的行数和要从中读取的容器来限制输出,则可以减少此问题
尝试:
docker compose log--无颜色--tail=1000>logs.txt
注:
服务名称是取自docker compose文件的服务名称-不是容器名称或容器id
(根据需要调整尾号。我添加了“-no color”以简化输出,但它不是必需的。)我提出的解决方案基于Chris McKinnel的答案,并进行了一些增强
我需要从我的nginx容器中转储最后一个1MIO记录,并docker撰写日志--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\u name:
来获得此常量
- 我正在使用它来解析json——使用一些特殊的选项来获得与原始nginx日志文件通常具有的格式相同的格式李>
在我的例子中,nginx日志最后1mio行的转储需要CCA10s。要查看容器日志的位置,我们使用docker inspect
docker inspect --format={{.LogPath}} <container id>
docker-inspect--format={{.LogPath}
这将为您提供保存日志的json文件的路径
在我的例子中,/var/lib/docker/containers/xxxx
然后我去那里,可以复制json文件
奇怪的是,我只有最后两周的日志。有什么方法可以获取更多信息吗?键入docker compose logs
开始对日志输出进行流式处理,对吗?我基本上希望将所有输出转储到一个文件中。我提出的命令的问题是,docker compose logs
不会终止,因此它不会将输出重定向到文件。日志是一个流,重定向会在接收数据时填充文件。你的文件有0个字节吗?使用&
而不是
?您的建议确实有效(它们用我的日志填充logs.txt),但是命令永远不会返回,因为docker compose日志会无限期运行。如果您运行docker compose logs
,该命令是否会自动退出?我想我可能会做一些粗俗的事情,比如:docker compose logs>&log.txt&
(注意&
背景),然后sleep 5;码头工人代码>但我希望能少一点草率。更新:这在Docker compose 1.7中得到了修复。(请参阅@larry cai answer)这是一个聪明的答案,但在Ubuntu上默认情况下需要su
权限,因为日志目录只能由root用户读取。我在那里看不到任何*-json.log,我应该先停止容器吗?第二个命令似乎没有按预期工作,因为它会在Windows计算机上产生以下错误消息:模板解析错误:Template::1:2:正在执行“”at:map没有键“LogPath”的条目。
命令“docker compose logs”没有退出。但它似乎并不包含所有日志。
docker inspect --format='{{.LogPath}}' nginx-1 \
| xargs tail -n 1000000 \
| jq -r -j .log > last1mio.log 2>&1
docker inspect --format={{.LogPath}} <container id>