如何部署 Grafana Loki 并将数据保存到 MinIO
Grafana Loki 是一个日志聚合系统,用于存储和查询来自应用程序和基础设施的日志。尽管很常见,但日志包含有关系统操作的关键信息,并且是调试和故障排除信息的宝贵来源。日志经常用于识别和跟踪恶意活动,或仅用于跟踪用户活动以提供商业情报。
在之前的博文中,使用 Grafana Loki 和 MinIO 进行日志记录,我们概述了 Loki 的组件及其整体架构。将用于日志的 Loki 视为类似于用于指标的 Prometheus。Loki 是轻量级且具有成本效益的,因为它仅索引和查询元数据。Promtail 代理在将日志发送到 Loki 之前收集、标记和转换日志。然后 Loki 索引元数据并将条目分组到用标签索引的流中。然后使用 Grafana 可视化和查询来自 Loki 的日志信息。从 2.0 版开始,Loki 将数据存储在单个对象存储后端中,例如 MinIO。之前的博文解释了将 Loki 数据保存到 MinIO 的优势,而这篇博文是一个教程,教您如何操作。
首先,我们将教您如何使用 Docker 容器部署 Loki 和 MinIO,然后是有关如何从源安装的说明。
使用 Docker 容器学习 Loki 和掌握 MinIO
我们使用 Docker 容器、一些脚本和 Git 存储库构建了一个演示。我们从 Grafana Loki 存储库开始,为 MinIO 添加了配置 yaml 和容器,并添加了一个脚本来为 Loki 数据创建和公开 MinIO 存储桶。以下步骤将导致这五个图像在 Docker 容器中本地运行:
洛基
促销
格拉法纳
最小IO
创建桶
Loki、Promtail 和 Grafana 显然需要前三个。它们已经可以从Loki 存储库下的 Grafana 获得(有一个简短的视频解释器)。MinIO 是 Loki 的对象存储,最终的容器将运行一个脚本来创建桶作为 Loki 目标。
Loki 已配置为使用loki.yaml. 特别重要的是以下部分:
请注意 MinIO 的 S3 地址中的点。这是因为不需要指定 AWS 区域。
我们使用该文件创建一个 Docker 环境docker-compose.yaml。我们将配置容器、卷、端口、网络并提供启动命令。
为了使loki图像作为容器运行,并通过卷访问 Loki 配置:
您需要进行的第一个配置是确保您的本地文件夹production正在与容器共享。请编辑volumes您的部分docker-compose.yaml以引用您下载文件夹的主机系统上的本地文件夹production。我们正在将主机路径映射到容器路径以便读取loki.yaml.
在 中docker-compose.yaml,我们还定义了一个网络并公开了运行 MinIO 服务器的容器的端口。在这种情况下,端口 9000 和 9001 将暴露给您的本地计算机,以便您使用浏览器访问 MinIO 服务器。
我们将网络配置为所有容器共享一个loki网络。每个容器都可以 ping 其他容器并使用它们的 API。不要为您的容器使用固定的 IP 地址。为了使它更容易,我们已经配置loki并minio在我们的环境中解析到适当的容器。例如:
下一步采取的行动docker-compose.yaml是在容器中运行 MinIO Client (mc) 以配置 MinIO Server,为 Loki 数据创建目标存储桶并根据public需要设置访问策略。
Promtail 是一个小型 Go 程序,用于跟踪或收集分布式日志文件并将它们传递给 Loki。对于此演示,Promtail 部署在其容器中,并带有一个抓取 /var/log 目录的配置文件。无需更改即可运行此演示并让它处理该位置的日志文件 - /var/log。
在本教程的最后,我们将介绍如何让 Promtail 抓取系统上的其他位置以获取日志文件。
脚步
现在您已了解如何配置 Loki、Promtail 和您的 Docker 环境,请按照以下步骤配置和运行演示环境。以下步骤使用docker-compose.yaml,loki.yaml和默认的 Promtail 配置来演示 Loki 如何与 MinIO 一起工作。下载我们的文件后,根据您的环境编辑它们。
克隆此存储库https://github.com/cniackz/loki:
将目录更改为本地production文件夹:
https://github.com/cniackz/loki/tree/main/production
构建本地 Docker 环境:
启动本地 Docker 容器:
要确认 Loki 数据正在保存到 MinIO,请在 http://localhost:9001或登录 MinIO 控制台http://minio:9001。本教程使用以下凭据:

登录后,单击存储桶。您应该会看到 Loki 存储桶已创建。

在右侧点击浏览,可以看到新建的bucket中的内容。您应该会fake在loki. 这是 Loki 将保存数据的地方。

单击其名称以打开fake目录。Loki 在配置的时间间隔内将日志保存在内存中,然后将它们写入对象存储。默认间隔为 5 分钟,因此请等待 5 分钟,让数据出现在您的存储桶中。

此时,Promtail 正在向 Loki 发送日志,而 Loki 正在将数据保存到 MinIO。现在,让我们设置 Grafana 以查看 Loki 日志。Grafana 6.0 及更高版本包括对 Loki 的内置支持。Grafana 6.3 及更高版本包括对LogQL功能的支持。
登录 Grafana http://loki:3000(默认凭据为 admin:admin)。
在 Grafana 中,单击左侧栏中的齿轮图标转到配置,然后单击数据源。单击添加数据源大按钮,然后选择 Loki。

将 http URL 字段编辑为我们使用 Docker 端口映射在本地运行的 Loki 服务器:http://loki:3100。

然后单击保存并测试。
要立即查看日志,请单击浏览。您还可以通过单击左侧边栏中的浏览来查看日志。无论您如何探索,然后在左上角的下拉列表中选择 Loki 数据源,然后使用“日志标签”按钮选择一个日志流。

您可以键入 LogQL 查询并单击运行查询。但是,如果您还不知道 LogQL,则可以使用 GUI 选择日志和查询参数。
要快速查看 Loki 中的日志,请单击日志浏览器,然后在下方1. Select labels to search in选择job,然后在下方2. Find values for the selected labels单击您的作业名称(来自promtail-local-config.yaml)。在这种情况下,我点击了varlogs。然后单击“显示日志”按钮。
您可以在浏览器窗口的右上方选择时间范围并设置查询的刷新间隔。

要查看日志的更多详细信息,请向下滚动并单击其中一个日志条目,它将提供与日志条目相关的其他信息。

一个真正强大的功能是能够通过单击图标直接从日志详细信息中labels过滤或查看统计信息。fields这简化了故障排除,因为它可以更轻松地查找重复出现的错误并在搜索词之间进行转换。
扩展演示
演示运行后,下一步是让 Promtail 抓取一组可能对您的用例更有趣的不同文件。为此,我们需要 Promtail 使用我们可以编辑的配置文件来运行。实现此目的的一种方法是在 Docker 中使用卷。
编辑docker-compose.yaml文件以创建 2 个可从 Promtail 容器访问的新卷。第一个提供对主机系统上将创建新配置文件的目录的访问。第二个提供对将包含感兴趣的日志文件的目录的访问。此外,Promtail 将引用新的配置文件启动,我们称之为promtail-local-config.yaml:
version: "3" networks: loki: services: loki: image: grafana/loki:latest volumes: - <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production ports: - "3100:3100" command: -config.file=/home/loki/production/loki.yaml networks: - loki promtail: image: grafana/promtail:2.4.2 volumes: - /var/log:/var/log -- <your-local-path>/loki/minio-loki-tutorial/production:/home/loki/production -- <your-local-path>/access_logs:/home/loki/access_logs command: -config.file=/home/loki/production/promtail-local-config.yaml networks: - loki grafana: image: grafana/grafana:latest ports: - "3000:3000" networks: - loki minio: image: minio/minio:latest ports: - "9000:9000" - "9001:9001" networks: - loki command: server ~ --address ':9000' --console-address ':9001' createbuckets: image: minio/mc networks: - loki depends_on: - minio entrypoint: > /bin/sh -c " /usr/bin/mc config host add myminio http://minio:9000 minioadmin minioadmin; /usr/bin/mc rm -r --force myminio/loki; /usr/bin/mc mb myminio/loki; /usr/bin/mc policy set public myminio/loki; exit 0; "
您可以在 Grafana 中使用日志数据执行更多操作。对于初学者,您可以在更多地方安装 promtail 以将更多日志拖到 Loki。将可执行文件复制到其他机器/实例/容器,按照Promtail 配置promtail-local-config.yaml中所述编辑配置并运行它。
我们现在需要创建 Promtail 配置文件,promtail-local-config.yaml以将本地系统日志发送到 Loki。从 Grafana下载并编辑示例配置文件。要关注的部分是scrape_configs因为这是告诉 promtail 要提取哪些日志、如何格式化它们以及将它们发送到哪里的地方。有关配置 promtail 的更多信息,请参阅获取登录到 Loki 。
该scrape_configs部分包括以下内容:
job_name - 这区分从其他日志组收集的日志。
目标 - 可选
static_configs。但是,经常定义,因为在旧版本的 Promtail 中它不是可选的。这是直接使用需要此条目的 Prometheus 服务发现代码的产物。labels - 应用于此定义抓取的每个日志行的静态标签。很好的例子包括环境名称、作业名称或应用程序名称。
path - Loki 要使用的日志的存储路径。
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: apache static_configs: - targets: - localhost labels: job: access_logs __path__: /home/loki/access_logs/*log
了解 Promtail 中抓取的不同配置选项很重要,Grafana 提供了大量详细信息。
查阅完整的promtail 配置参考可能有助于了解应用程序的全部功能。
最后,将一些 Apache Web 服务器访问日志放在docker-compose.yaml主机系统上文件中指定的目录中。这些是 Promtail 将提取并发送给 Loki 进行处理的日志:
-- <your-local-path>/access_logs:/home/loki/access_logs
完成编辑并放置示例 Apache 访问日志后,关闭容器并使用 docker compose 备份:
docker-compose down docker-compose up -d
Promtail 随后将加载新的 Apache 访问日志文件,并将它们提供给 Loki。
我们在本教程中创建的环境有助于开始使用 Loki,但它不是生产就绪的。接下来的步骤是将 Docker 留给 Kubernetes,并使用分布式 MinIO 而不是单个实例。最终,Loki 数据变得足够大,可以从外部数据库中获益以进行快速索引搜索。有关更多信息,请参阅可扩展性 - 使用 Grafana Loki 进行扩展。
结论
Grafana、Prometheus 和 AlertManager 的可观察性堆栈在 Loki 中得到了强大的补充(顺便说一句,我们在 MinIO 上也有 Grafana、Prometheus 和 AlertManager 的教程)。分布式系统,尤其是当由 Kubernetes 进行容器化和编排时,其应用程序和微服务有许多日志。Loki 结合 MinIO 是一种收集、存储和查询日志的经济高效的方式。
如果您有任何问题,请发送电子邮件至sales@minio.org.cn,或加入MinIO slack 频道并提问。