介绍
Grafana Loki 是一个水平可扩展、高可用、多租户的日志聚合系统,其灵感来源于 Prometheus。它被设计为极具成本效益且易于操作。与其它日志系统不同,Loki 不索引日志的内容,而是索引每个日志流的一组标签(labels)。
在这个 Lab 中,你将使用 Grafana Loki 的官方 Docker 镜像执行一个基础安装。你将学习如何创建一个最小化的配置文件,并将 Loki 服务作为一个容器启动。这是使用 Loki 构建完整日志堆栈(logging stack)的第一步基础。
拉取 Loki Docker 镜像
在这一步,你将从 Docker Hub 下载官方的 Grafana Loki Docker 镜像。docker pull 命令会从仓库(registry)获取一个镜像或一个仓库。你的 Lab 环境已经安装并配置了 Docker。
在终端中执行以下命令来拉取最新的 Loki 镜像:
docker pull grafana/loki
你将看到指示下载进度的输出。Docker 默认会拉取带有 latest 标签的镜像。
预期输出(版本号可能有所不同):
latest: Pulling from grafana/loki
a48641c1b8a9: Pull complete
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for grafana/loki
docker.io/grafana/loki
创建基础 loki-config.yaml 文件
在这一步,你将为 Loki 创建一个最小化的配置文件。这个文件 loki-config.yaml 告诉 Loki 如何运行、在哪里存储数据以及使用哪种 schema(模式)。对于本次 Lab,我们将配置 Loki 使用本地文件系统进行存储。
我们将使用 nano 文本编辑器来创建文件。运行以下命令打开一个名为 loki-config.yaml 的新文件:
nano loki-config.yaml
现在,将以下 YAML 内容复制并粘贴到 nano 编辑器中:
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /tmp/loki/index
cache_location: /tmp/loki/cache
filesystem:
directory: /tmp/loki/chunks
ruler:
alertmanager_url: http://localhost:9093
limits_config:
allow_structured_metadata: false
此配置将 Loki 所需的所有内容都保留在容器内的 /tmp/loki 目录下,这可以避免权限问题,并使设置易于理解。它禁用了身份验证(authentication),为单节点使用启用了内存中的环(in-memory ring),并将块(blocks)和索引(indexes)存储在本地文件系统上。
文件中每个部分的作用如下:
auth_enabled: false: 关闭身份验证,这样你就可以在没有额外凭证的情况下与 Loki 通信。这使得本地测试更简单;在生产环境中,你会启用身份验证。server.http_listen_port: 3100: 告诉 Loki 在端口 3100 上监听 HTTP 请求。当你 curllocalhost:3100时,你访问的就是这个端口。common.path_prefix: 设置 Loki 在容器内部存储临时数据的基础文件夹。此文件中其他所有路径都基于/tmp/loki构建,因此所有内容都保留在一个地方。common.storage.filesystem: 指向 Loki 存储日志数据块(chunks)和规则文件(rule files)的两个文件夹。由于我们没有挂载任何特殊内容到容器中,使用/tmp/loki可以避免权限方面的麻烦。common.ring.kvstore.store: inmemory: 将成员信息保存在内存中。对于单节点 Lab 来说这很完美;一个真正的集群会使用像 Consul 或 etcd 这样的共享存储。schema_config: 定义 Loki 应如何布局日志数据的索引。我们设置了一个起始日期,选择了boltdb-shipper存储,并将索引保留在文件系统上。prefix和period控制文件的命名方式以及新索引文件的创建频率(每 24 小时)。storage_config: 为boltdb-shipper索引(active_index_directory和cache_location)以及原始块存储提供了确切的文件夹。所有路径再次位于/tmp/loki下,以保持整洁。ruler.alertmanager_url: 准备 Loki 的 ruler 组件,以便将警报发送到http://localhost:9093的 Alertmanager。如果 Alertmanager 没有运行,Loki 不会崩溃;当它尝试发送警报时,只会记录一个警告。limits_config.allow_structured_metadata: false: 禁用了一个高级功能,以便 Loki 坚持使用初学者期望的更简单、纯文本的日志元数据。
按下 Ctrl+X 退出,然后按 Y 确认保存,最后按 Enter 以 loki-config.yaml 的名称保存文件。
使用配置文件在 3100 端口运行 Loki 容器
现在你已经有了 Loki 镜像和一个配置文件,你将把 Loki 作为一个 Docker 容器来运行。你将使用 docker run 命令来启动容器、挂载你的配置文件并暴露必要的端口。
执行以下命令:
docker run -d --name loki -v $(pwd)/loki-config.yaml:/etc/loki/config.yml -p 3100:3100 grafana/loki -config.file=/etc/loki/config.yml
我们来分解一下这个命令:
-d: 在分离模式(detached mode,即后台)下运行容器。--name loki: 为容器指定名称loki,以便于引用。-v $(pwd)/loki-config.yaml:/etc/loki/config.yml: 将你本地的loki-config.yaml文件挂载到容器内的/etc/loki/config.yml位置。Loki 将从该文件中读取其配置。-p 3100:3100: 将宿主机(host machine)的端口3100映射到容器内的端口3100,允许你访问 Loki API。grafana/loki: 用于容器的镜像名称。-config.file=/etc/loki/config.yml: 传递给 Loki 进程的命令行参数,告诉它在哪里可以找到配置文件。
运行该命令后,Docker 将打印新创建的容器的唯一 ID。
e8a9f2b1c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0
验证 localhost:3100/ready 上的 Loki 就绪端点
在这一步,你将执行一个健康检查(health check),以确认 Loki 服务器已启动并正常运行。Loki 暴露了一个 /ready HTTP 端点可用于此目的。成功的响应表明服务器已准备好接收请求。
使用 curl 命令向此端点发送请求。由于在上一步中我们将端口 3100 进行了映射,你可以通过 localhost:3100 访问它。
curl http://localhost:3100/ready
如果 Loki 启动成功,它将以文本 ready 和 HTTP 200 OK 状态码进行响应。
预期输出:
ready
检查 Loki 日志以确认启动
验证 Loki 成功启动的另一种方法是检查其容器日志(logs)。这对于调试配置问题或其他启动故障非常有用。docker logs 命令用于获取容器的日志。
使用以下命令查看你的 loki 容器的日志:
docker logs loki
你应该会看到详细说明启动过程的输出。查找确认服务器正在监听连接的日志行。这表明服务已在没有关键错误的情况下初始化。
预期输出片段(日志详情可能有所不同):
level=info ts=... caller=server.go:299 http=[::]:3100 grpc=[::]:9096 msg="server listening on addresses"
level=info ts=... caller=loki.go:372 msg="Loki started"
总结
恭喜你!你已成功完成本次实验(Lab)。
在本次实验中,你学习了启动 Grafana Loki 实例的基本步骤。你已经:
- 从 Docker Hub 拉取了官方 Loki Docker 镜像。
- 创建了一个基本的
loki-config.yaml文件,用于定义服务器和存储设置。 - 在 Docker 容器中启动了 Loki,挂载了配置文件并暴露了 API 端口。
- 使用其
/ready端点并通过检查容器日志,验证了 Loki 实例正在运行且健康。
这个基础设置是构建更复杂、更健壮的日志架构的基础。从这里开始,你可以继续配置一个日志收集代理(如 Promtail)将日志发送到 Loki,并使用 Grafana 来查询和可视化这些日志。



