【问题标题】:How to redirect docker container logs to a single file?如何将 docker 容器日志重定向到单个文件?
【发布时间】:2017-04-29 21:36:52
【问题描述】:

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

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

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

docker logs container > /tmp/stdout.log

但它不起作用。

【问题讨论】:

    标签: logging docker


    【解决方案1】:

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

    解释:

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

    【讨论】:

      【解决方案2】:

      docker logs -f docker_container_name >> YOUR_LOG_PATH 2>&1 &

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          结构是:

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

          【讨论】:

          • 这在 Windows 10 家庭版上对我有用。谢谢
          【解决方案5】:

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

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

          希望对大家有所帮助!

          【讨论】:

          • 根据容器名称将所有容器日志保存到文件中...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
          【解决方案6】:

          由于 Docker 为我们合并了 stdout 和 stderr,我们可以像对待任何其他 shell 流一样对待日志输出。要将当前日志重定向到文件,请使用重定向运算符

          $ docker logs test_container &gt; output.log
          docker logs -f test_container &gt; output.log

          不要将输出发送到 stderr 和 stdout,而是将应用程序的输出重定向到文件并将文件映射到容器外部的永久存储。

          $ docker logs test_container&gt; /tmp/output.log

          Docker 不接受命令行中的相对路径,因此如果您想使用不同的目录,则需要使用完整路径。

          【讨论】:

          • 这不会捕获所有日志,您需要使用&amp;&gt; 重定向std out 和std err 参见其他答案。
          【解决方案7】:

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

          docker logs container > container.log 2>&1
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              这个选项怎么样:

              docker logs containername &gt;&amp; logs/myFile.log

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

              【讨论】:

              • 如果我没记错的话,这个命令基本上会把容器启动时的所有日志都复制到myFile.logs中。对吧?
              • @SAndrew 基本上是的!但是新版本的 Docker 可能会改变。最好看看docker logs --help 确定
              • 这不会流式传输日志,只需将当前历史记录粘贴到文件中
              【解决方案10】:

              无需重定向日志。

              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 并且它什么也不返回,这就像有时一样。在那种情况下,该文件将不可用。

              【讨论】:

              • tail -f `docker inspect --format='{{.LogPath}}' myapp` - 真的是 JSON
              • 如果该文件不存在,它将失败。表示如果 docker 不生成任何日志,则不会创建此文件。但是如果 docker 生成日志,那么这个命令很适合查看实时日志。谢谢亚当。将其添加到我的答案中以帮助他人。
              • "Docker 默认将日志存储到一个日志文件中。" - 在什么情况下?在 docker 主机上运行的所有容器都会输出到单个文件?一个容器?
              • @ChrisStryczynski Docker 为每个容器创建一个日志文件
              【解决方案11】:

              假设你有多个容器,并且你想将日志聚合到一个文件中,你需要使用一些日志聚合器,比如 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,它将开始将日志写入文件。

              这里是link for step by step instructions

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

              【讨论】:

              • 我从这个答案中学到了一些东西。尽管它可能不直接适合 OP,但它很可能是大多数偶然发现此线程的人的灵感。
              • 这正是我想要的,谢谢!你为我写了完美的日志收集方式。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-10-19
              • 2017-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-19
              • 1970-01-01
              相关资源
              最近更新 更多