`docker stack`特定的日志位置

时间:2018-04-16 12:44:16

标签: docker docker-compose docker-swarm

是否可以使用docker文件在已部署的docker-compose.yml堆栈上指定日志文件?

我在Docker服务上运行间歇性崩溃,在docker swarm上运行堆栈,没有留下任何日志跟踪,我需要一些旋转日志,我可以看到这些日志发生时

我的docker info输出:

$ docker info
Containers: 114
 Running: 4
 Paused: 0
 Stopped: 110
Images: 95
Server Version: 17.09.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog

2 个答案:

答案 0 :(得分:1)

根据您关于旋转日志的问题,您可以为堆栈文件中的每个服务添加以下选项:

  logging:
   driver: "json-file"
   options:
      max-size: "5m"
      max-file: "3"

您还可以使用泊坞窗服务日志service_name查看特定服务的日志。

默认情况下,当一个容器退出时,它没有被删除,所以你总能看到它的日志。

编辑

您可以使用以下内容将其重定向到文件(-f标志以跟随输出)

(nohup docker service logs service -f  >> /path-to-file/file.log)&

以下是检查哪个docker服务日志输出已被重定向。

ps aux | grep "docker service logs"

答案 1 :(得分:1)

有几个原因可能导致你无法得到你想要的东西。

  1. 是的@hichamx以上是正确的,您可以更改服务的默认JSON日志驱动程序的文件大小设置,但这可能不是您的问题。

  2. 删除容器时会删除日志。使用Swarm服务,那些"任务"只会在Task History Retention Limit中看到docker info。默认为5,这意味着4个旧任务将会挂起。如果您的服务任务在启动后快速崩溃,您就会明白......日志并不长。使用docker swarm update --task-history-limit设置更大的数字,磁盘空间允许。

  3. docker service logs仅显示您的应用向容器内的stdout / stderr 报告的内容。他们不会向你展示Swarm协调者正在采取的行动。请使用docker events。它并不存储太多的历史记录,因此您需要在shell中保持运行状态,或者以其他方式捕获历史记录。 events告诉你容器创建/删除/失败等事情。

  4. 理想情况下,如果应用程序在内部执行某项操作,则会在退出时报告错误,而Docker将在容器中检查.State.Error下的元数据。单行很酷,但有时不像我们需要的那样灵活。这是一个首先列出a中所有任务,然后获取每个任务的容器ID,然后检查每个容器并显示错误(如果有)的示例。不幸的是,它仅适用于您所连接的本地服务器上的容器,但希望您能够了解每个$()内的嵌套命令。

  5. docker inspect -f "{{.State.Error}}" $(docker inspect -f "{{.Status.ContainerStatus.ContainerID}}" $(docker service ps <servicename> -q))