Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 将docker compose日志保存到文件_Logging_Docker_Docker Compose - Fatal编程技术网

Logging 将docker compose日志保存到文件

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的输出重定向到文件的方法,或者找到日志文件本身的实际位置

我想要相当于:

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>