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

KET*_*TIL 88 logging docker

我想将docker容器的所有日志重定向到单个日志文件以进行分析.我试过了

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
Run Code Online (Sandbox Code Playgroud)

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

docker logs container > /tmp/stdout.log
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

pl_*_*ock 111

无需重定向日志.

Docker默认将日志存储到一个日志文件中.要检查日志文件路径运行命令:

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

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
Run Code Online (Sandbox Code Playgroud)

打开该日志文件并进行分析.

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

编辑:

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

tail -f `docker inspect --format='{{.LogPath}}' containername`
Run Code Online (Sandbox Code Playgroud)

注意:

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log仅当docker生成日志(如果没有日志)时才会创建此日志文件,那么此文件将不存在.如果我们运行命令docker logs containername并且它什么都不返回,它就像某些时候类似.在那种情况下,此文件将不可用.

  • `tail -f \`docker inform --format='{{.LogPath}}' myapp\`` - 它确实是 JSON (2认同)

Edd*_*dez 104

这个选项怎么样:

docker logs containername >& logs/myFile.log

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


jua*_*cks 26

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

说明:

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


小智 13

下面对我有用,

docker logs <container-id> > mylogs.txt 2>&1
Run Code Online (Sandbox Code Playgroud)


小智 6

首先检查你的容器id

docker ps -a
Run Code Online (Sandbox Code Playgroud)

您可以在 CONTAINER ID 列中看到第一行。可能看起来像这样“3fd0bfce2806”,然后在 shell 中输入它

docker inspect --format='{{.LogPath}}' 3fd0bfce2806
Run Code Online (Sandbox Code Playgroud)

你会看到类似这样的东西

/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log
Run Code Online (Sandbox Code Playgroud)

那么你可以将其视为

cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log
Run Code Online (Sandbox Code Playgroud)

它将是 JSON 格式,您可以使用时间戳来跟踪错误


Abh*_*oda 5

假设您有多个容器,并且想将日志聚合到一个文件中,则需要使用一些日志聚合器,例如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
Run Code Online (Sandbox Code Playgroud)

第二步将是更新流利的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> 
Run Code Online (Sandbox Code Playgroud)

在此配置中,我们要求将日志写入此路径的单个文件
/fluentd/log/service/service.*.log

第三步将是运行自定义的fluentd,它将开始将日志写入文件。

这是分步说明链接

有点长,但是正确的方法,因为您可以更好地控制日志文件路径等,并且在Docker Swarm中也很好用。

  • 我从这个答案中学到了一些东西。尽管它可能不直接适合OP,但它很可能对大多数偶然发现这条线索的人来说是一种启发。 (2认同)

小智 5

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

docker logs container > container.log 2>&1
Run Code Online (Sandbox Code Playgroud)