Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 如何将docker容器日志重定向到单个文件?_Logging_Docker - Fatal编程技术网

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

Logging 如何将docker容器日志重定向到单个文件?,logging,docker,Logging,Docker,我想将docker容器的所有日志重定向到单个日志文件,以对其进行分析。我试过了 docker logs container > /tmp/stdout.log 2>/tmp/stderr.log 但这会给日志提供两个不同的文件。我已经试过了 docker logs container > /tmp/stdout.log 但是它不起作用。不需要重定向日志 默认情况下,Docker将日志存储到一个日志文件中。要检查日志文件路径,请运行命令: docker inspect --f

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

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
但这会给日志提供两个不同的文件。我已经试过了

docker logs container > /tmp/stdout.log

但是它不起作用。

不需要重定向日志


默认情况下,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/f844a7b45ca5a9589ffaaa1a5bd8dea0f4e79f0e2ff639c1d10d96afb4b53334/f844a7b45ca9589ffaa1a5bd8dea0f4e79f0f2ff639c1d10d96afb533334/f844a7b45ca5ca9589ffaa1a5d8dea10d0f4e9f4e79f2ff639c1d9c1d10d10d10d96afb533334。类似于有时我们运行命令
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
时间片格式%Y%m%d
时间片等待10米
时间\u格式%Y%m%dT%H%m%S%z
@打印副本
@类型文件
路径/fluentd/log/service/service.*.log
时间片格式%Y%m%d
时间片等待10米
时间\u格式%Y%m%dT%H%m%S%
在此配置中,我们要求将日志写入到此路径的单个文件
/fluentd/log/service/service.*.log

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

这是你的电话号码

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

Docker logs-f&>your.log&

说明:

  • -f
    (即
    --follow
    ):写入所有现有日志并继续(跟随)记录下一步的所有内容
  • &>
    重定向标准输出和标准错误
  • 您可能希望在后台运行该方法,因此
    &
  • 您可以通过以下方式将输出和stderr分开:
    >output.log 2>error.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

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

docker logs container > container.log 2>&1

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

$docker logs test\u container>output.log

docker日志-f test\u container>output.log

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

$docker logs test\u container>/tmp/output.log


Docker将不接受命令行上的相对路径,因此如果要使用其他目录,则需要使用完整路径。

如果您在Windows上工作并使用PowerShell(如我),则可以使用以下行来捕获
stdout
stderr

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
docker日志|输出文件'C:/dev/mylog.txt'

我希望它能帮助别人

我使用的最简单方法是在终端上执行以下命令:

docker logs elk > /home/Desktop/output.log
结构是:

docker logs <Container Name> > path/filename.log
docker日志>路径/filename.log

首先检查您的容器id

docker ps -a
您可以在容器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日志-f docker\u容器\u名称>>您的\u日志路径2>&1&

tail-f`docker-inspect--format='{.LogPath}}'myapp`
-如果该文件不在那里,它确实会失败。表示如果docker未生成任何日志,则不会创建此文件。但如果docker生成日志,那么这个命令很适合查看实时日志。谢谢你,亚当。将其添加到我的答案中以帮助他人。“Docker默认将日志存储到一个日志文件。”-在什么上下文中?在docker主机上运行的所有容器是否将输出到单个文件?单个容器?@ChrisStryczynski Docker会为每个容器创建一个日志文件如果我没有错,这个命令基本上会将容器启动时的所有日志复制到myFile.logs。是吗?@SAndrew基本上是的!但新版本的Docker可能会改变。最好查看
docker日志--help
以确保这不会流式传输日志,只需将当前历史粘贴到文件中,即可根据容器名称将所有容器日志保存到文件中
foreach($中的元素(docker ps-a——格式为“{.Names}”){docker logs$element | Out File“C:/dockerlogs/$element.log”}
这并不能捕获所有的日志,您需要用
&>
重定向std Out和std err查看另一个答案。我从这个答案中学到了一些东西。尽管它可能不直接适合OP,但对于大多数偶然发现这条线索的人来说,它很可能是一个灵感。这正是我想要的,谢谢!你为我写了完美的方式