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: 负责采集日志并发送给 Loki
  • loki: 包含两个实例,一个用于写入日志,一个用于读取日志(提高可扩展性)
  • minio: 用于存储日志数据的开源对象存储
  • grafana: 可视化界面,用于查询和展示日志
  • gateway: Nginx 路由服务

检查服务状态:

两个服务返回 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 数据源。

查看日志步骤:

  1. 点击 Log browser,选择 container 标签
  2. 选择一个容器(如 loki_flog_1
  3. 点击 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 是一个非常值得尝试的选择。


原始标题:Introduction to Grafana Loki

« 上一篇: Eclipse JKube 指南
» 下一篇: MicroK8s 简介