如何将 Docker 容器日志重定向到单个文件?

我想重定向我的码头集装箱的所有日志到单日志文件来分析它们

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

但这会给日志添加两个不同的文件,我已经试过了

docker logs container > /tmp/stdout.log

但是没有成功。

211388 次浏览

不需要重定向日志。

默认情况下,Docker 将日志存储到一个日志文件中:

docker inspect --format='\{\{.LogPath}}' containername


/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log

打开日志文件分析一下。

如果重定向日志,那么只能在重定向之前获取日志。您将无法看到实时日志。

编辑:

要查看实时日志,可以运行以下命令

tail -f `docker inspect --format='\{\{.LogPath}}' containername`

注:

只有当 docker 生成日志时,才会创建这个日志文件 /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log,如果没有日志,那么这个文件就不存在。类似的情况是,如果我们运行命令 docker logs containername,它什么也不返回。在这种情况下,这个文件将不可用。

这个选项怎么样:

docker logs containername >& logs/myFile.log

它不会重定向问题中要求的日志,而是将它们复制一次到特定的文件。

假设您有多个容器,并且希望将日志聚合到一个文件中,那么需要使用一些日志聚合器,比如 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

第二步是更新 fluentd conf,以满足服务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 群太。

docker logs -f <yourContainer> &> your.log &

说明:

  • -f(即 --follow) : 写入所有现有日志,接下来记录接下来发生的所有事情。
  • &>重定向标准输出和标准错误。
  • 您可能希望在后台运行该方法,因此 &
  • 可以通过 > output.log 2> error.log(而不是使用 &>)将 stdout 和 stderr 分开。

将所有容器日志复制到指定目录的 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

要将 stdout & stderr 从 docker 容器捕获到单个日志文件,请运行以下命令:

docker logs container > container.log 2>&1

由于 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 不接受命令行上的相对路径,因此如果您想使用不同的目录,则需要使用完整的路径。

如果你在 Windows 上工作并且使用 PowerShell (像我一样) ,你可以使用以下代码来捕获 stdoutstderr:

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

我希望它能帮到别人!

我在终端上使用的最简单的方法是这个命令:

docker logs elk > /home/Desktop/output.log

结构是:

docker logs <Container Name> > path/filename.log

首先检查你的集装箱标识

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 log-f docker _ Container _ name > > YOUR _ LOG _ PATH 2 > & 1 &

下面是我的工作,

docker logs <container-id> > mylogs.txt 2>&1

这个命令对我有效:

$ docker logs -f containername &> /tmp/out.log &