Grafana Loki 本地快速上手:用 Docker Compose 搭建 SSD 集群并完成日志收集与查询

Grafana Loki 本地快速上手:用 Docker Compose 搭建 SSD 集群并完成日志收集与查询 Grafana Loki 本地快速上手用 Docker Compose 搭建 SSD 集群并完成日志收集与查询【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/lokiLokiLike Prometheus, but for logs是 Grafana 推出的日志聚合系统它只对日志内容做索引、而不是对日志全文建立索引因此相比传统日志系统更省资源、更贴近 Prometheus 的使用习惯。本文基于仓库内 docs/sources/get-started/quick-start/quick-start.md 官方快速入门文档带你在一台 Linux 机器上用 Docker Compose 搭建一个完整的本地 Loki 集群从 flog 生成模拟日志、Grafana Alloy 采集推送到 nginx 网关路由、Loki read/write/backend 三组件分工再到 MinIO 对象存储与 Grafana 可视化。读完本文你将掌握如何用三份配置一键拉起整套环境、如何验证集群健康状态、如何在 Grafana 中用 Builder/Code 两种模式编写 LogQL 查询以及 SSD 模式下租户 IDX-Scope-OrgID为何必不可少。环境准备运行本地 Loki 集群的前置条件在开始之前请确认本机已安装以下两个基础工具Docker用于运行 Loki、MinIO、Grafana 等容器安装文档https://docs.docker.com/installDocker Compose用于按声明式配置一次性编排并启动整套多容器环境安装文档https://docs.docker.com/compose/install。官方文档同时假设你运行在 Linux 系统上quick-start.md 明确注明 This quickstart assumes you are running Linux。如果你不想在本机安装任何依赖也可以使用官方的在线交互学习环境 Loki Quickstart SandboxKillercoda 提供它是一个已装好全部依赖的沙箱与本文操作步骤一一对应。架构总览这份 Docker Compose 到底拉起了什么本次快速入门使用的docker-compose.yaml位于仓库 examples/getting-started/docker-compose.yaml它启动了一套Simple Scalable DeploymentSSD模式的 Loki 集群。SSD 模式把 Loki 的全部微服务组件按职责分成三个逻辑组运行见 docs/sources/get-started/components.md 中的组件分配表逻辑组运行的组件readQuery Frontend、QuerierwriteDistributor、IngesterbackendIndex Gateway、Compactor、Ruler、Bloom Planner实验性、Bloom Builder实验性、Bloom Gateway实验性整套环境共 8 个容器各自职责如下flogmingrammer/flog日志生成器持续产生模拟 HTTP 请求的日志行Grafana Alloy从 Docker 容器元数据中发现 flog 容器抓取日志并推送到 Loki 网关gatewaynginx作为唯一对外入口:3100按 URL 路径把请求路由到 read/write 组件read / write / backend三个 Loki 进程通过-targetread、-targetwrite、-targetbackend启动不同组件组合MinIOS3 兼容对象存储Loki 用它保存索引index和数据块chunksGrafana预置好 Loki 数据源用于可视化查询日志。容器间通过 memberlist 协议互相发现、组成分布式集群并用 MinIO 作为共享存储。三个 Loki 容器共享同一份 loki-config.yaml只通过-target参数区分各自职责——这正是 Loki“单二进制多组件”构建模型的体现见 docs/sources/get-started/deployment-modes.md“Loki is a distributed system consisting of many microservices. It also has a unique build model where all of those microservices exist within the same binary”用-target指定启动哪些微服务。注意SSD 模式simple scalable deployment已被标记为deprecated计划在 Loki 4.0 中移除。官方建议生产环境参考 deployment modes 文档选择当前推荐的部署方式如 HA Monolithic 或 Microservices。本教程使用 SSD 只是为了在一台机器上快速体验 Loki 全流程。第一步拉取配置并一键启动1. 创建工作目录创建一个名为evaluate-loki的目录作为演示环境并进入该目录mkdir evaluate-loki cd evaluate-loki2. 下载三份关键配置文件需要下载loki-config.yaml、alloy-local-config.yaml、docker-compose.yaml三个文件。可以用wgetwget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml -O loki-config.yaml wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/alloy-local-config.yaml -O alloy-local-config.yaml wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml -O docker-compose.yaml也可以用curl达到相同效果curl https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml --output loki-config.yaml curl https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/alloy-local-config.yaml --output alloy-local-config.yaml curl https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml --output docker-compose.yaml这三份配置在仓库中的对应源文件为examples/getting-started/loki-config.yamlLoki 三个组件共用的服务端配置examples/getting-started/alloy-local-config.yamlAlloy 的采集与推送配置examples/getting-started/docker-compose.yaml整套环境的编排定义。3. 启动整套环境在evaluate-loki目录下执行docker compose up -d命令结束时你会看到类似以下的输出8 个容器全部启动成功✔ Network evaluate-loki_loki Created 0.1s ✔ Container evaluate-loki-minio-1 Started 0.6s ✔ Container evaluate-loki-flog-1 Started 0.6s ✔ Container evaluate-loki-backend-1 Started 0.8s ✔ Container evaluate-loki-write-1 Started 0.8s ✔ Container evaluate-loki-read-1 Started 0.8s ✔ Container evaluate-loki-gateway-1 Started 1.1s ✔ Container evaluate-loki-grafana-1 Started 1.4s ✔ Container evaluate-loki-alloy-1 Started 1.4s容器命名规则evaluate-loki-服务名-1前缀来自 Compose 项目名即目录名evaluate-loki。如果你换了目录名后面的 LogQL 查询示例也需要同步修改容器标签。4. 验证 Loki 集群健康状态可选read 组件就绪后访问 http://localhost:3101/ready 会返回ready。在未就绪之前页面会显示Query Frontend not ready: not ready: number of schedulers this worker is connected to is 0Querier 工作进程尚未连接到 Query Schedulerwrite 组件就绪后访问 http://localhost:3102/ready 会返回ready。未就绪时显示Ingester not ready: waiting for 15s after being readyIngester 就绪后仍需等待 15 秒预热。端口映射见 docker-compose.yamlread 容器把内部3100映射到宿主3101write 容器映射到宿主3102。5. 验证 Grafana Alloy 运行状态可选Grafana Alloy 的调试 UI 监听在 http://localhost:12345可以在这里查看它的抓取目标与运行日志。6. 检查所有容器状态可选docker ps -a深度解读三份配置各自做了什么loki-config.yaml集群如何组织examples/getting-started/loki-config.yaml 是三个 Loki 容器共用的配置文件关键块如下serverHTTP 监听地址0.0.0.0、端口3100这是 Loki 容器内部的统一服务端口read/write/backend 三个进程在各自容器内都监听它memberlistjoin_members: [read, write, backend]通过 DNS 解析互相加入bind_port: 7946是 gossip 通信端口集群元数据hash ring通过 memberlist 协议在节点间传播无需外部 KV 存储schema_configstore: tsdb、object_store: s3、schema: v13、索引周期24h——Loki 用 TSDB 索引格式对象数据存到 S3 兼容存储common.storage.s3endpoint 指向minio:9000容器网络内 DNS 名、insecure: true、bucketnames: loki-data、access_key_id: loki、secret_access_key: supersecret、s3forcepathstyle: truecommon.replication_factor: 1SSD 演示环境只跑一个 write 实例副本数设为 1common.compactor_address: http://backend:3100压缩器Compactor只运行在 backend 组件上ruler.storage.s3bucketnames: loki-rulerrule 状态单独存一个 bucketcompactor.working_directory: /tmp/compactor压缩临时目录。从实现上看-targetread/write/backend正是通过 cmd/loki/main.go 中的cfg.DynamicUnmarshal解析命令行参数后由 pkg/loki/loki.go 中的-targetflag默认值为all与模块注册机制见 pkg/loki/loki.go 中isTarget(Querier)、isTarget(Ingester)等判断决定启动哪些服务模块。你可以用loki -list-targets查看当前版本支持的全部 target。alloy-local-config.yaml日志如何被采集examples/getting-started/alloy-local-config.yaml 是 Alloy 的采集配置全部使用 Alloy 组件语法discovery.docker flog_scrape通过unix:///var/run/docker.sock发现本机 Docker 容器每 5 秒刷新discovery.relabel flog_scrape把__meta_docker_container_name重写为container标签这样每条日志都带有容器名标签正则/(.*)去掉名称开头的/loki.source.docker flog_scrape从 Docker 读取 flog 容器日志应用 relabel 规则后转发给loki.write.default.receiverloki.write default把日志推送到http://gateway:3100/loki/api/v1/push并指定tenant_id tenant1。注意到 Alloy 挂载了宿主机的/var/run/docker.sock见 docker-compose.yaml这是它能够发现并读取容器日志的前提。docker-compose.yaml组件如何串联examples/getting-started/docker-compose.yaml 中值得关注的细节read/write/backend 都挂载同一份loki-config.yaml仅通过command中的-target区分read 还加了-query-scheduler.use-scheduler-ringfalse演示环境无需独立 scheduler ringbackend 加了-legacy-read-modefalse三个 Loki 容器都暴露 7946 端口memberlist gossip并共享loki网络且read/write都声明了网络别名lokiloki-dnsanchor保证join_members能解析到彼此gateway 容器nginx是唯一对外入口宿主端口3100:3100。它按 URL 路由/loki/api/v1/push转发到 write/loki/api/v1/tail转发到 read并带上 WebSocket upgrade 头其余/loki/api/*走 read。Alloy、Grafana 都通过http://gateway:3100访问 Lokiminio 容器启动时创建/data/loki-datachunks和/data/loki-rulerruler 状态两个目录账号密码loki/supersecret控制台在:9001flog 容器command: -f json -d 200ms -l表示以 JSON 格式、每 200ms 一条的速度持续输出日志-l让输出持续不断grafana 容器通过 entrypoint 里的 shell 脚本在启动时把 Loki 数据源写入/etc/grafana/provisioning/datasources/ds.yaml无需手工配置数据源详见下文。第二步在 Grafana 中查看日志进入 Explore 查询界面整套环境自带 Grafana访问 http://localhost:3000 即可进入。演示用的 Grafana 已经通过 provisioning 预配置好了 Loki 数据源操作步骤如下在 Grafana 左侧主菜单点击Explore图标打开 Explore 页在顶部菜单中把数据源切换为Loki页面会显示 Loki 查询编辑器Loki 查询编辑器提供两种模式Builder 模式可视化查询设计器通过下拉框和标签选择器组合查询Code 模式功能完整的 LogQL 手写编辑器。用 Code 模式编写 LogQL 查询点击Code进入代码模式将下面的示例查询复制进编辑器然后点击Run Query执行。以下查询假设你严格按上文步骤创建了evaluate-loki目录如果你换了目录名需要把查询里的容器标签同步替换为你实际看到的容器名。1. 查看 flog 容器的全部日志行Loki 称之为一个 log stream——日志流{containerevaluate-loki-flog-1}Loki 使用标签labels作为描述日志流的元数据一切 Loki 查询都以标签选择器开头本例的选择器就是{containerevaluate-loki-flog-1}。2. 查看 grafana 容器的全部日志行{containerevaluate-loki-grafana-1}3. 在 flog 流中查找包含字符串status的日志行|是子串匹配运算符{containerevaluate-loki-flog-1} | status4. 在 flog 流中查找 JSON 字段status等于404的日志行| json先把日志解析为 JSON再用status404 精确匹配字段值{containerevaluate-loki-flog-1} | json | status4045. 计算 JSON 字段status为404的每秒日志条数sum by(container) (rate({containerevaluate-loki-flog-1} | json | status404 [$__auto]))最后这条是指标查询metric query返回的是时间序列Grafana 会因此绘制出曲线图你还可以点击Bars把它切换成柱状图查看。用 Builder 模式可视化构建查询点击Builder标签回到构建器模式点击Kick start your query展开Log query starters区域选择第一项Parse log lines with logfmt parser点击Use this query应用回到 Explore 页点击Label browser在弹出的对话框里选择一个容器并点击Show logs即可看到该容器的日志。更多 flog 示例查询flog 生成的是模拟 HTTP 请求日志以下是基于这份样例数据的更多查询查看 flog 生成的全部日志行{containerevaluate-loki-flog-1}查看所有GET请求日志{containerevaluate-loki-flog-1} | GET查看所有POST方法日志{containerevaluate-loki-flog-1} | POST查看所有 401 状态码未授权错误日志{containerevaluate-loki-flog-1} | json | status401查看所有不包含文本401的日志行!是反向子串匹配{containerevaluate-loki-flog-1} ! 401关于 LogQL 的完整语法请参考仓库内 LogQL 查询文档 与 查询示例。Grafana 中的 Loki 数据源是如何自动配置的本示例中 Loki 数据源已经在 Grafana 中预配置好这个逻辑就写在 docker-compose.yaml 的 grafana 服务里grafana: image: grafana/grafana:latest environment: - GF_PATHS_PROVISIONING/etc/grafana/provisioning - GF_AUTH_ANONYMOUS_ENABLEDtrue - GF_AUTH_ANONYMOUS_ORG_ROLEAdmin depends_on: - gateway entrypoint: - sh - -euc - | mkdir -p /etc/grafana/provisioning/datasources cat EOF /etc/grafana/provisioning/datasources/ds.yaml apiVersion: 1 datasources: - name: Loki type: loki access: proxy url: http://gateway:3100 jsonData: httpHeaderName1: X-Scope-OrgID secureJsonData: httpHeaderValue1: tenant1 EOF /run.shentrypoint 中这段配置的含义配置项值说明nameLoki数据源名称typeloki数据源类型accessproxy访问方式为代理urlhttp://gateway:3100Loki 数据源地址Loki 用 nginx 网关把流量分发到对应组件jsonData.httpHeaderName1X-Scope-OrgID组织 ID租户 ID请求头名称secureJsonData.httpHeaderValue1tenant1组织 ID 请求头值重要当 Loki 以非 monolithic单体模式部署时本教程的 SSD 模式即属此类每个请求必须携带租户 ID 请求头X-Scope-OrgID否则查询会返回授权错误authorization error。这正是数据源配置里显式加上这个请求头的原因。Alloy 侧的推送配置loki.write default也设置了tenant_id tenant1保证写入与查询使用同一个租户见 alloy-local-config.yaml。下一步体验完整的指标、日志、链路与剖析环境到此你已经完整走通了 Loki 本地快速入门演示。如果想进一步体验涵盖Mimir指标、Loki日志、Tempo链路、Grafana可视化的一体化演示环境官方推荐 Introduction to Metrics, Logs, Traces, and Profiling in Grafana 项目它是一个自带详尽的单实例部署注释配置的自包含学习环境并支持把数据推送到 Grafana Cloud帮助你理解可观测性三支柱指标、日志、链路如何协同工作。【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考