我想将 docker 容器的所有日志重定向到单个日志文件来分析它们。我试过了
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
但这会登录两个不同的文件。我已经试过了
docker logs container > /tmp/stdout.log
但是没有成功。
这个选项怎么样:
docker logs containername >& logs/myFile.log
它不会重定向问题中要求的日志,而是将它们复制一次到特定文件。
无需重定向日志。
Docker 默认将日志存储到一个日志文件中。要检查日志文件路径运行命令:
docker inspect --format='{{.LogPath}}' containername
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
打开该日志文件并分析。
如果您重定向日志,那么您只会获得重定向之前的日志。您将无法看到实时日志。
编辑:
要查看实时日志,您可以运行以下命令
tail -f `docker inspect --format='{{.LogPath}}' containername`
注意:
此日志文件
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
仅在docker生成日志时才会创建,如果没有日志则不会有此文件。这类似于有时我们运行命令 docker logs containername
但它什么也不返回。在这种情况下,该文件将不可用。
docker logs -f <yourContainer> &> your.log &
说明:
-f
(即--follow
):写入所有现有日志并follows记录接下来的所有内容。&>
重定向标准输出和标准错误。&
。> output.log 2> error.log
(而不是使用 &>
)。要将 stdout 和 stderr 从 docker 容器捕获到单个日志文件,请运行以下命令:
docker logs container > container.log 2>&1
假设您有多个容器,并且希望将日志聚合到单个文件中,则需要使用一些日志聚合器,例如 Fluentd。支持 Fluentd 作为 docker 容器的日志记录驱动程序。
所以在docker-compose中,需要定义日志驱动
service1:
image: webapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service1
service2:
image: myapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service2
第二步是更新 Fluentdconf 以适应服务 1 和服务 2 的日志
<match service1>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</store>
</match>
<match service2>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%
</store>
</match>
在此配置中,我们要求将日志写入此路径的单个文件中
/fluentd/log/service/service.*.log
第三步是运行自定义的 Fluentd,它将开始将日志写入文件。
这是逐步说明的链接
有点长,但正确的方法,因为你可以更好地控制日志文件路径等,并且它在 Docker Swarm 中也运行良好。
以下对我有用,
docker logs <container-id> > mylogs.txt 2>&1
首先检查您的容器 ID
docker ps -a
您可以在 CONTAINER ID 列中看到第一行。 可能看起来像这样“3fd0bfce2806” 然后在shell中输入
docker inspect --format='{{.LogPath}}' 3fd0bfce2806
你会看到类似这样的东西
/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log
然后你可以看到它
cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log
它是JSON格式的,您可以使用时间戳来跟踪错误
这个命令对我有用:
$ docker logs -f containername &> /tmp/out.log &
我使用的最简单的方法是在终端上使用此命令:
docker logs elk > /home/Desktop/output.log
结构是:
docker logs <Container Name> > path/filename.log
正如 @juanmirocks 指出的那样,将容器输出连续记录到您可以使用的文件中:
docker logs -f <yourContainer> &> your.log &
要追加到现有文件数据的末尾而不是覆盖它,您可以使用追加重定向器
>>
而不是输出重定向器 &>
,如下所示:
docker logs -f <yourContainer> >> your.log &
将所有容器日志复制到指定目录的Bash脚本:
#!/usr/bin/env bash
TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `sudo docker ps --format '{{.Names}}'`;
do
path=$(sudo docker inspect --format='{{.LogPath}}' $name)
sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
如果您在 Windows 上工作并使用 PowerShell(像我一样),您可以使用以下行来捕获
stdout
和 stderr
:
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
我希望它对某人有帮助!
docker 日志 -f docker_container_name >> YOUR_LOG_PATH 2>&1 &
对于单个正在运行的容器,您只需将其添加到
run
命令即可。 --log-opt
选项实际上是一个 “列表”,在本例中意味着多次添加相同的 --log-opt
标志会添加到此列表中:
--log-opt <NAME>=<VALUE>
要查找正在运行的容器的实际logging-driver:
docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER_NAME>
要直接配置容器,您可以在启动容器时添加选项。
_注意:如果您了解日志旋转,则
--log-opt
选项对您来说很熟悉。
docker run -d --name <CONTAINER_NAME> \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
<IMAGE_NAME:TAG_NAME>
/etc/docker/daemon.json
(主守护程序配置文件,可能不存在)。
示例:
{
"log-driver": "local",
"log-opts": {
"max-size": "10m"
}
}
有各种各样的默认日志驱动程序几乎适用于您的所有用例,从 rPi 到 AWS,从 Linux 到内置于
dockerd
的 Windows。
由于 Docker 为我们合并了 stdout 和 stderr,因此我们可以像对待任何其他 shell 流一样对待日志输出。要将当前日志重定向到文件,请使用重定向运算符
$ docker logs test_container > output.log
docker logs -f test_container > output.log
不要将输出发送到 stderr 和 stdout,而是将应用程序的输出重定向到文件并将该文件映射到容器外部的永久存储。
$ docker logs test_container> /tmp/output.log
Docker 不会接受命令行上的相对路径,因此如果您想使用不同的目录,则需要使用完整路径。