【发布时间】:2017-04-29 21:36:52
【问题描述】:
我想将我的 docker 容器的所有日志重定向到单个日志文件以分析它们。我试过了
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
但这会在两个不同的文件中登录。我已经试过了
docker logs container > /tmp/stdout.log
但它不起作用。
【问题讨论】:
我想将我的 docker 容器的所有日志重定向到单个日志文件以分析它们。我试过了
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
但这会在两个不同的文件中登录。我已经试过了
docker logs container > /tmp/stdout.log
但它不起作用。
【问题讨论】:
docker logs -f <yourContainer> &> your.log &
解释:
-f(即--follow):写入所有现有日志并跟随记录接下来的所有内容。&> 重定向标准输出和标准错误。&。> output.log 2> error.log(而不是使用 &>)分隔 stdout 和 stderr。【讨论】:
docker logs -f docker_container_name >> YOUR_LOG_PATH 2>&1 &
【讨论】:
首先检查您的容器 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 格式,您可以使用时间戳来跟踪错误
【讨论】:
我使用的最简单的方法是终端上的这个命令:
docker logs elk > /home/Desktop/output.log
结构是:
docker logs <Container Name> > path/filename.log
【讨论】:
如果您在 Windows 上工作并使用 PowerShell(像我一样),您可以使用以下行来捕获 stdout 和 stderr:
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"}
由于 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 不接受命令行中的相对路径,因此如果您想使用不同的目录,则需要使用完整路径。
【讨论】:
&> 重定向std out 和std err 参见其他答案。
要将 docker 容器中的 stdout 和 stderr 捕获到单个日志文件中,请运行以下命令:
docker logs container > container.log 2>&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
【讨论】:
这个选项怎么样:
docker logs containername >& logs/myFile.log
它不会重定向问题中要求的日志,而是将它们复制一次到特定文件。
【讨论】:
docker logs --help 确定
无需重定向日志。
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
假设你有多个容器,并且你想将日志聚合到一个文件中,你需要使用一些日志聚合器,比如 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 中也很有效。
【讨论】: