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

dur*_*dur 5 logging docker grafana-loki

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

\n

安装

\n

我在我的 Docker 引擎(版本20.10.2)上安装了 Loki\'s Docker Driver Client 作为Docker 插件:

\n
$ docker plugin install grafana/loki-docker-driver:master-54d1d3b --alias loki --grant-all-permissions\n
Run Code Online (Sandbox Code Playgroud)\n

我没有使用标签lastest,因为错误无法连接到 Swarm 中的日志插件

\n

配置

\n

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

\n
$ docker container run\n  --log-driver=loki\n  --log-opt loki-url="$LOKI_URL"\n  --log-opt loki-retries=5\n  --log-opt loki-batch-size=400\n  --log-opt max-size="10m"\n  --log-opt max-file=5\n  --detach\n  --name $CONTAINER_NAME\n  --restart unless-stopped\n  $IMAGE:$TAG\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

问题

\n

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

\n
$ docker container logs 75d4b13eb3e8\nerror from daemon in stream: Error grabbing logs: error getting log reader: LogDriver.ReadLogs: logger does not exist for 75d4b13eb3e8203b9247ecdeb41fdf495cc8fea7dcfc4775fd8261263b1dcd32\n
Run Code Online (Sandbox Code Playgroud)\n

研究

\n

我查看了容器的目录(请参阅包含容器日志的日志文件在哪里?),但我看不到任何日志文件:

\n
$ sudo ls /var/lib/docker/containers/75d4b13eb3e8203b9247ecdeb41fdf495cc8fea7dcfc4775fd8261263b1dcd32\ncheckpoints  config.v2.json  hostconfig.json  hostname  hosts  mounts  resolv.conf  resolv.conf.hash\n
Run Code Online (Sandbox Code Playgroud)\n

我还检查了日志路径(请参阅获取实例\xe2\x80\x99s 日志路径),但它是空的:

\n
$ docker inspect --format=\'{{.LogPath}}\' 75d4b13eb3e8\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ sudo ls -la /var/lib/docker/plugins/eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288/rootfs/var/log/docker/75d4b13eb3e8203b9247ecdeb41fdf495cc8fea7dcfc4775fd8261263b1dcd32\ntotal 912\ndrwxr-xr-x  2 root root   4096 Jan 22 12:59 .\ndrwxr-xr-x 17 root root   4096 Jan 22 15:46 ..\n-rw-r-----  1 root root 923177 Jan 22 13:34 json.log\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$ sudo journalctl -u docker.service | grep eac33cc9913c\n[...]\n[...]level=error msg="panic: send on closed channel" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="goroutine 153 [running]:" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="main.(*loki).Log(0xc0000c5e00, 0xc0001d81c0, 0xc0000c5e80, 0x0)" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="\\t/src/loki/cmd/docker-driver/loki.go:69 +0x2fb" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="main.consumeLog(0xc0002c0480)" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="\\t/src/loki/cmd/docker-driver/driver.go:165 +0x4c2" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="created by main.(*driver).StartLogging" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]level=error msg="\\t/src/loki/cmd/docker-driver/driver.go:116 +0xa75" plugin=eac33cc9913ca962a189904392e516dd495d6fd52391fb5af4a34af46b281288\n[...]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"\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n

我做错了什么?

\n

小智 0

我遇到了同样的问题。

我在配置上唯一的区别是,我正在试用最新的企业版(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"
Run Code Online (Sandbox Code Playgroud)

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

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

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