繁体   English   中英

为什么 Loki 的 Docker 驱动程序客户端在一段时间后停止登录?

[英]Why is Loki's Docker Driver Client stopping to log after some time?

我想将我的 Docker 容器的日志发送到Grafana Loki 因此,我安装了 Loki 的Docker 驱动客户端并用它启动了我的容器。 首先我可以看到日志,但一段时间后我看不到更多日志。

安装

我在我的 Docker 引擎(版本20.10.2 )上安装了 Loki 的 Docker 驱动程序客户端作为Docker 插件

$ docker plugin install grafana/loki-docker-driver:master-54d1d3b --alias loki --grant-all-permissions

我没有使用标签lastest ,因为错误Unable to connect to logging plugin in Swarm

配置

我使用 Loki 的 Docker Driver Client 作为日志驱动程序启动了我的 Docker 容器:

$ docker container run
  --log-driver=loki
  --log-opt loki-url="$LOKI_URL"
  --log-opt loki-retries=5
  --log-opt loki-batch-size=400
  --log-opt max-size="10m"
  --log-opt max-file=5
  --detach
  --name $CONTAINER_NAME
  --restart unless-stopped
  $IMAGE:$TAG

我还添加了 json-log 驱动程序的max-sizemax-file来限制磁盘空间,请参阅配置 Docker 驱动程序

问题

首先,我可以在Grafana和命令行中使用docker container logs ,但一段时间后不再显示日志。 如果我尝试查看 Docker 主机上的日志并看到错误:

$ docker container logs 75d4b13eb3e8
error from daemon in stream: Error grabbing logs: error getting log reader: LogDriver.ReadLogs: logger does not exist for 75d4b13eb3e8203b9247ecdeb41fdf495cc8fea7dcfc4775fd8261263b1dcd32

研究

我查看了容器的目录(请参阅Where is a log file with logs from a container? ),但我看不到任何日志文件:

$ sudo ls /var/lib/docker/containers/75d4b13eb3e8203b9247ecdeb41fdf495cc8fea7dcfc4775fd8261263b1dcd32
checkpoints  config.v2.json  hostconfig.json  hostname  hosts  mounts  resolv.conf  resolv.conf.hash

我还检查了日志路径(请参阅Get an instance's log path ),但它是空的:

$ docker inspect --format='{{.LogPath}}' 75d4b13eb3e8

我在插件目录中找到了容器的日志(请参阅Loki 日志驱动程序未将日志作为文件存储在磁盘上,即使使用 keep-file: true ),但日志文件不再更改:

$ sudo ls -la /var/lib/docker/plugins/eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288/rootfs/var/log/docker/75d4b13eb3e8203b9247ecdeb41fdf495cc8fea7dcfc4775fd8261263b1dcd32
total 912
drwxr-xr-x  2 root root   4096 Jan 22 12:59 .
drwxr-xr-x 17 root root   4096 Jan 22 15:46 ..
-rw-r-----  1 root root 923177 Jan 22 13:34 json.log

我查看了 Docker 守护程序的日志(请参阅阅读日志)并发现错误和警告(同时记录停止):

$ sudo journalctl -u docker.service | grep eac33cc9913c
[...]
[...]level=error msg="panic: send on closed channel" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="goroutine 153 [running]:" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="main.(*loki).Log(0xc0000c5e00, 0xc0001d81c0, 0xc0000c5e80, 0x0)" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="\t/src/loki/cmd/docker-driver/loki.go:69 +0x2fb" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="main.consumeLog(0xc0002c0480)" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="\t/src/loki/cmd/docker-driver/driver.go:165 +0x4c2" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="created by main.(*driver).StartLogging" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=error msg="\t/src/loki/cmd/docker-driver/driver.go:116 +0xa75" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288
[...]level=warning msg="Unable to connect to plugin: /run/docker/plugins/eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288/loki.sock/LogDriver.StopLogging: Post http://%2Frun%2Fdocker%2Fplugins%2Feac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288%2Floki.sock/LogDriver.StopLogging: EOF, retrying in 1s"
[...]

我做错了什么?

我遇到了同样的问题。

我在配置上的唯一区别是我正在试用最新的企业版 (19.03),因为它带来了双重日志记录功能,尽管最新的 CE 版本也支持此功能,并且我使用的是最新的 Loki Docker 驱动程序客户端,现在 Github前面提到的问题已经解决。

我最终在 docker-compose.yml 中设置了log-opts 属性no-filekeep-file

logging:
  driver: "loki"
  options:
    loki-url: "http://${LOKI_URL}:3100/loki/api/v1/push"
    loki-batch-size: "400"
    no-file: "false"
    keep-file: "true"
    max-size: "5m"
    max-file: "3"

由于进行了此更改,我在 Loki 中接收日志并且仍然可以在我的 Docker 主机上使用 docker 容器日志和 docker 服务日志。

no-file: "false"告诉驱动程序继续在磁盘上创建日志和keep-file: "true"告诉驱动程序在容器停止时保留 json 日志(默认情况下文件被删除)。

注意:最初我将这些设置添加到主机上的 /etc/docker/daemon.json 但仍然会看到error getting log reader ,我不得不切换到为每个容器/群服务指定日志驱动程序。

关于这个问题

首先,我可以在 Grafana 和命令行中使用 docker 容器日志查看日志,但一段时间后不再显示日志。

Grafana 上请 select查询类型:范围不是即时,如果 loki 中存在,您将看到所选时间段内的所有日志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM