是否可以使用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
答案 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)
有几个原因可能导致你无法得到你想要的东西。
是的@hichamx以上是正确的,您可以更改服务的默认JSON日志驱动程序的文件大小设置,但这可能不是您的问题。
删除容器时会删除日志。使用Swarm服务,那些"任务"只会在Task History Retention Limit
中看到docker info
。默认为5,这意味着4个旧任务将会挂起。如果您的服务任务在启动后快速崩溃,您就会明白......日志并不长。使用docker swarm update --task-history-limit
设置更大的数字,磁盘空间允许。
docker service logs
仅显示您的应用向容器内的stdout / stderr 报告的内容。他们不会向你展示Swarm协调者正在采取的行动。请使用docker events
。它并不存储太多的历史记录,因此您需要在shell中保持运行状态,或者以其他方式捕获历史记录。 events
告诉你容器创建/删除/失败等事情。
理想情况下,如果应用程序在内部执行某项操作,则会在退出时报告错误,而Docker将在容器中检查.State.Error
下的元数据。单行很酷,但有时不像我们需要的那样灵活。这是一个首先列出a中所有任务,然后获取每个任务的容器ID,然后检查每个容器并显示错误(如果有)的示例。不幸的是,它仅适用于您所连接的本地服务器上的容器,但希望您能够了解每个$()
内的嵌套命令。
docker inspect -f "{{.State.Error}}" $(docker inspect -f "{{.Status.ContainerStatus.ContainerID}}" $(docker service ps <servicename> -q))