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

问题描述 投票:0回答:15

我想将 docker 容器的所有日志重定向到单个日志文件来分析它们。我试过了

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

但这会登录两个不同的文件。我已经试过了

docker logs container > /tmp/stdout.log

但是没有成功。

logging docker
15个回答
283
投票

这个选项怎么样:

docker logs containername >& logs/myFile.log

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


234
投票

无需重定向日志。

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
但它什么也不返回。在这种情况下,该文件将不可用。


95
投票

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

说明:

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

22
投票

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

docker logs container > container.log 2>&1

18
投票

假设您有多个容器,并且希望将日志聚合到单个文件中,则需要使用一些日志聚合器,例如 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 中也运行良好。


14
投票

以下对我有用,

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

6
投票

首先检查您的容器 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格式的,您可以使用时间戳来跟踪错误


3
投票

这个命令对我有用:

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

2
投票

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

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

结构是:

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

2
投票

正如 @juanmirocks 指出的那样,将容器输出连续记录到您可以使用的文件中:

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

要追加到现有文件数据的末尾而不是覆盖它,您可以使用追加重定向器

>>
而不是输出重定向器
&>
,如下所示:

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

1
投票

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

0
投票

如果您在 Windows 上工作并使用 PowerShell(像我一样),您可以使用以下行来捕获

stdout
stderr

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

我希望它对某人有帮助!


0
投票

docker 日志 -f docker_container_name >> YOUR_LOG_PATH 2>&1 &


0
投票

迟来的答案:内置的 Docker 日志驱动程序

对于单个正在运行的容器,您只需将其添加到

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。


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

© www.soinside.com 2019 - 2024. All rights reserved.