Docker 驱动客户端
Grafana Loki 官方支持一个 Docker 插件,用于读取 Docker 容器的日志并将其发送到 Loki。该插件可配置为将日志发送到私有 Loki 实例或 Grafana Cloud。
注意
Windows 不支持 Docker 插件;请参阅Docker Engine 托管插件系统文档了解更多信息。
关于配置 Loki Docker 驱动的文档可以在 如果您在使用 Docker 插件时有任何问题或疑问,请在Loki 仓库中提交问题。
安装 Docker 驱动客户端
必须在每个运行需要收集日志的容器的 Docker 主机上安装 Docker 插件。
运行以下命令安装插件,根据需要更新发布版本或更改架构(目前支持 arm64
和 amd64
):
docker plugin install grafana/loki-docker-driver:3.3.2-arm64 --alias loki --grant-all-permissions
注意
对于 ARM64 主机,在镜像标签中添加
-arm64
。
要检查已安装的插件,请使用 docker plugin ls
命令。已成功启动的插件将被列为已启用状态
docker plugin ls
您应该看到类似于以下的输出
ID NAME DESCRIPTION ENABLED
ac720b8fcfdb loki Loki Logging Driver true
成功安装插件后,您可以配置它。
升级 Docker 驱动客户端
升级过程包括禁用现有插件,升级(根据需要更改版本和架构),然后重新启用并重启 Docker
docker plugin disable loki --force
docker plugin upgrade loki grafana/loki-docker-driver:3.3.2-arm64 --grant-all-permissions
docker plugin enable loki
systemctl restart docker
注意
将版本号更新到相应的版本。
卸载 Docker 驱动客户端
要干净地卸载插件,请禁用并移除它
docker plugin disable loki --force
docker plugin rm loki
已知问题:Docker Daemon 死锁
该驱动程序将所有日志保存在内存中,如果 Loki 无法访问且 max_retries
的数量超出,它将丢弃日志条目。为了避免丢弃日志条目,将 max_retries
设置为零允许无限重试;驱动程序将永远尝试,直到 Loki 再次可访问。永远尝试可能会产生不良后果,因为 Docker daemon 将等待 Loki 驱动程序处理容器的所有日志,直到容器被移除。因此,如果容器卡住,Docker daemon 可能会永远等待。
通过设置 loki-retries=2
、loki-max-backoff=800ms
、loki-timeout=1s
和 keep-file=true
可以缩短等待时间。这样,daemon 将只被锁定很短的时间,并且当 Loki 客户端无法重新连接时,日志将被本地持久化。
此外,您还可以通过在您的 docker-compose
文件中设置 services.logger.logging.options.mode=non-blocking
来使用非阻塞模式。非阻塞意味着如果 Loki 暂时不可用或无法处理日志消息,将日志写入 Loki 的过程不会阻塞应用程序或服务的主流程。在非阻塞模式下,日志消息将被缓冲并异步发送到 Loki,这使得主线程可以继续工作而不会延迟。如果 Loki 不可用,日志消息将存储在缓冲区中,并在 Loki 再次可用时发送。然而,此设置有助于防止由于日志记录问题而阻塞应用程序或服务的主流程,但如果缓冲区溢出或 Loki 长时间不可用,也可能导致日志消息丢失。
为避免此问题,请使用 Promtail 的Docker 目标或Docker 服务发现。