1. 简介
在构建大型软件系统时,可观测性(Observability) 是一项至关重要的质量属性,涵盖日志聚合、指标采集、链路追踪等多个方面。
本文将介绍 Grafana Loki,它是 Grafana 生态中用于日志聚合的重要组件。我们将从其工作原理、部署方式、日志采集与查询等角度进行解析,帮助你快速上手使用 Loki。
2. 什么是 Grafana Loki?
Grafana 是目前主流的开源可观测性平台提供商,Loki 是其日志聚合组件。它借鉴了 Prometheus 的设计理念,具备高可扩展性,能够处理 PB 级别的日志数据。
2.1. Loki 的工作原理
Loki 与其他日志聚合系统(如 Elasticsearch)最大的区别在于它不索引完整的日志内容,而是只索引日志的标签(Labels)和元数据(Metadata),日志正文则被压缩存储,供后续查询使用。
✅ 优点:
- 吞吐量高,适合大规模日志采集
- 存储成本低,因为不索引正文内容
❌ 缺点:
- 无法像 Elasticsearch 那样进行全文搜索
- 查询性能受限于日志内容的解析方式
⚠️ 因此,Loki 更适合用于日志的结构化分析,而不是全文检索场景。
3. 使用 Grafana Loki
接下来我们通过一个简单的部署示例,来演示如何快速搭建 Loki 环境,并采集和查看日志。
3.1. 安装部署
Loki 支持多种部署方式,包括 Kubernetes、单机运行、Docker 等。我们这里使用 Docker Compose 来部署一个本地测试环境,不适用于生产环境。
步骤如下:
$ mkdir grafana-loki
$ cd grafana-loki
$ wget 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/promtail-local-config.yaml -O promtail-local-config.yaml
$ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml -O docker-compose.yaml
然后启动服务:
$ docker-compose up -d
启动的服务包括:
flog
: 生成模拟日志的应用promtail
: 负责采集日志并发送给 Lokiloki
: 包含两个实例,一个用于写入日志,一个用于读取日志(提高可扩展性)minio
: 用于存储日志数据的开源对象存储grafana
: 可视化界面,用于查询和展示日志gateway
: Nginx 路由服务
检查服务状态:
- Loki 读服务:http://localhost:3101/ready
- Loki 写服务:http://localhost:3102/ready
两个服务返回 ready
表示部署成功。
3.2. 日志采集
Promtail 是 Loki 的日志采集代理,支持多种日志源,如本地文件、syslog、Kafka、Gelf 等。
我们的示例配置文件 promtail-local-config.yaml
中定义了如下内容:
scrape_configs:
- job_name: flog_scrape
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container'
这段配置表示:
- 从本地 Docker 容器中采集日志
- 将容器名作为标签
container
添加到日志中
⚠️ 踩坑提醒:确保 Docker 套接字挂载正确,否则 Promtail 无法读取容器日志。
3.3. 日志查看
Loki 的日志查询是通过 Grafana 实现的。访问 Grafana 地址:http://localhost:3000,登录后点击 Explore
,选择 Loki 数据源。
查看日志步骤:
- 点击
Log browser
,选择container
标签 - 选择一个容器(如
loki_flog_1
) - 点击
Show logs
,即可查看该容器的日志
等价的 Loki 查询语句为:
{container="loki_flog_1"}
4. 日志搜索
由于 Loki 不索引日志正文内容,因此搜索方式与传统日志系统不同。但借助 Grafana 提供的过滤器和解析器,我们仍然可以实现高效的日志查询。
4.1. JSON 过滤器
适用于结构化日志(如 JSON 格式):
{container="loki_flog_1"} | json http_method="method" | http_method = `POST`
解释:
| json http_method="method"
:将 JSON 字段method
解析为新标签http_method
| http_method = POST
:筛选出POST
请求
4.2. 行过滤器(Line Filter)
适用于非结构化日志:
{container="loki_flog_1"} |= `"method": "POST"`
⚠️ 注意:这种方式是精确匹配,包括空格、引号都必须完全一致。
4.3. 正则表达式过滤
使用正则表达式提取字段进行过滤:
{container="loki_flog_1"} | regexp `"method": "(?P<http_method>.*)", "request"` | http_method = `POST`
该表达式基于 Go 的正则语法,使用命名组 http_method
提取字段。
5. 总结
Grafana Loki 是一个轻量、高效的日志聚合系统,适用于大规模日志采集和结构化查询场景。
✅ 优势:
- 存储成本低
- 与 Prometheus、Grafana 生态无缝集成
- 易于部署和维护
❌ 劣势:
- 不支持全文索引
- 查询性能依赖日志结构和解析能力
如果你的系统日志是结构化的,且需要与监控指标、可视化面板紧密结合,Loki 是一个非常值得尝试的选择。