logs重定向 - docker-compose logging




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

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

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

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

docker logs container > /tmp/stdout.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

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

第二步是更新流利的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 Swarm。


无需重定向日志。

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为我们合并了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不会接受命令行上的相对路径,因此如果要使用其他目录,则需要使用完整路径。


这个选项怎么样:

docker logs containername >& logs/myFile.log

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


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

说明:

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




docker