可观测性 | Grafana Loki 日志聚合方案快速体验

767 阅读7分钟

前言

在云原生时代,日志管理作为系统可观测性的三大支柱之一,正经历着变革。传统 ELK(Elasticsearch、Logstash、Kibana)以及其变体 EFK(Elasticsearch、Fluentd、Kibana)日志解决方案,虽曾是行业标准,但在容器集群分布式部署的云原生环境下,其资源消耗高、配置复杂、全文索引压力大以及 Kibana 缺乏多租户管理等缺点逐渐凸显,难以满足现代 IT 系统的需求。

与此同时,Grafana Loki 作为云原生时代的新兴日志解决方案,凭借其轻量级、高效的设计理念,专为容器化和微服务架构而生,展现出强大的适应性。

本文将通过实践案例,简要介绍如何使用 Grafana Loki 快速搭建日志中心,以 Nginx 日志为例,实现日志的采集、汇聚与检索。

PS:众多大厂从 EFK 演进到 ClickHouse 而不是 Loki,后期会全方位对比 EFK、Loki 和 ClickHouse。

关键词:云原生 标签索引 对象存储 多租户 轻量级

Grafana Loki

Grafana Loki 是一个开源的高扩展性、多租户的日志聚合系统,由 Grafana Labs 开发。它专为云原生环境设计,特别适合 Kubernetes 等容器化场景。

Loki 通过标签索引日志流,而不是直接索引日志内容,因此具有低成本、高效查询的特点。

Grafana Loki 的官方介绍:Like Prometheus,but for logs。

like-prometheus.png

与其他日志系统不同,Loki 的构建理念是仅索引日志标签的元数据(类似于 Prometheus 的标签)。日志数据本身会被压缩并以块的形式存储在对象存储中,例如 Amazon Simple Storage Service (S3) 或 Google Cloud Storage (GCS),甚至本地文件系统中。

典型的基于 Loki 的日志栈由 3 个组件组成:

  • 采集代理,例如 Grafana Alloy 或 Promtail。代理抓取日志,添加标签将日志转换为流,并通过 HTTP API 将流推送到 Loki。
  • Loki,主服务器,负责提取和存储日志以及处理查询。
  • Grafana 用于查询和显示日志数据。还可以从命令行 LogCLI、Loki API 查询日志。

Promtail 为 Grafana Loki 内置的采集代理,在同一个 GitHub 仓库中。 Promtail 现在已被官方宣布弃用,建议使用 Grafana Alloy 替代。

loki-overview-2.png

Grafana Loki 作为云原生时代的日志解决方案,凭借其高效、轻量和灵活的特点,正在成为越来越多企业和开发者的首选。

Loki 教程【翻译】

本快速入门指南使用 Docker Compose 以单体模式部署 Loki,旨在快速体验 Loki 日志检索方式(面向日志使用人员)

Grafana Loki 只是 Grafana 日志可观察性堆栈的一个组件。在本教程中,我们将此堆栈称为Loki 栈

getting-started-loki-stack-3.png

Grafana 最初与 Prometheus 相辅相成,以监控仪表盘而闻名。

随着云原生可观测性的概念与技术兴起,该团队孵化了一系列产品:Grafana Loki、Grafana Alloy、Grafana Tempo、Grafana Mimir

Loki 栈由以下组件组成:

  • Alloy(Promtail): Grafana Alloy 是一个开源遥测收集器,用于收集指标、日志、追踪信息和持续配置文件。在本快速入门指南中,Grafana Alloy 已配置,采集所有 Docker 容器日志并转发到 Loki。
  • Loki:日志聚合系统,用于存储收集到的日志。
  • Grafana: 监控和可观测性的开源平台,用于查询和可视化存储在 Loki 中的日志。

快速部署

  1. 克隆 Loki 基础存储库并切入 getting-started 分支:
git clone https://github.com/grafana/loki-fundamentals.git -b getting-started
  1. 进入目录 loki-fundamentals
cd loki-fundamentals
  1. loki-fundamentals使用 Docker Compose 将 Loki、Alloy 和 Grafana 部署为当前工作目录:
docker compose up -d

运行命令后,看到类似输出:

 ✔ Container loki-fundamentals-grafana-1  Started  0.3s 
 ✔ Container loki-fundamentals-loki-1     Started  0.3s 
 ✔ Container loki-fundamentals-alloy-1    Started  0.4s
  1. 随着 Loki 堆栈的运行,现在可以验证每个组件是否已启动并正在运行:

Grafana 日志检索

由于 Grafana Alloy 已配置为从所有 Docker 容器中跟踪日志,因此 Loki 已经接收了日志。

验证日志收集情况的最佳方法是使用 Grafana 日志 Drilldown 下钻功能。

导航至 http://localhost:3000/drilldown ,选择 Logs

应该会看到 Grafana 日志下钻页面。

get-started-drill-down.png

看到三个容器及其日志:

  • loki-fundamentals-alloy-1
  • loki-fundamentals-grafana-1
  • loki-fundamentals-loki-1

loki-fundamentals-loki-1 容器中,单击 Show logs 以深入了解该容器的日志。

get-started-drill-down-container.png

Loki 实践:Nginx 日志采集

本项目中使用 Promtail 采集日志

在上一章节,引用了 Grafana Loki 的官方部署教程,以最简单的方式快速体验了 Loki 栈的产品样式。

本章节从最基本的应用出发,采集 Nginx 日志,进一步了解 Loki 栈的相关组件的作用与配置方式。


系统架构

+--------+    日志文件    +-----------+    推送日志    +--------+    查询日志    +-----------+
| Nginx  | ------------> | Promtail  | ------------> |  Loki  | <------------ | Grafana   |
+--------+               +-----------+               +--------+               +-----------+

访问 Nginx 服务器网页:http://localhost:8080

日志格式:json,由 nginx.conf 中定义

查看日志,日志文件存在于

  1. 本地磁盘:loki-nginx/logs/ -> access.log error.log

local-disk.png

loki-nginx-access-log.png

  1. Docker Desktop 容器内部:

如果是在 Linux 服务器中,需要进入容器内部查看 docker exec -it nginx-service /bin/sh

docker-in.png

  1. 通过 Grafana WebUI 检索

快速部署

克隆仓库 github 或 gitee

# git clone git@github.com:xiaolinstar/loki-nginx.git
git clone https://github.com/xiaolinstar/loki-nginx.git
# git clone git@gitee.com:xingxiaolin/loki-nginx.git
git clone https://gitee.com/xingxiaolin/loki-nginx.git

进入项目

cd loki-nginx

使用 Docker Compose 启动

docker compose up -d

可以看到以下启动状态

 ✔ Network loki-nginx_loki-nginx-network  Created                                               
 ✔ Container nginx-service                Started                                               
 ✔ Container loki-service                 Started                                               
 ✔ Container grafana-service              Started                                               
 ✔ Container promtail-service             Started 

大约 5 秒后,确认所有服务都健康运行

# docker ps
docker compose ps 

使用 Grafana WebUI 查看 Nginx 日志

通过浏览器访问网页,并检索日志。

访问 Nginx 网页

启动 Nginx 容器服务,用户的访问日志都会被记录。

在浏览器中访问

一般匹配页:

错误匹配页(url为error前缀访问):

在 Grafana 中查看

访问: http://localhost:9000

在 Explore 中检索日志,输入关键词 error 匹配

grafana-loki-explore.png

对比与思考

当应用系统部署到生产环境中后,如果日志处于裸奔状态且其生命周期与容器一致,那么无论是管理还是检索,都将变得非常困难。

本章通过一个最简单的 Loki-Nginx 日志示例,初步展示了 Grafana Loki 的能力和使用方式。然而,这种简单的示例无法完整体现日志中心的强大功能。

当集群以分布式方式部署,且日志格式复杂、需要基于日志排查问题时,Loki 日志中心的优势才会真正凸显出来,它在这些场景下将发挥极为重要的作用。

总结与展望

通过 Docker Compose 快速启动了 2个示例项目,并利用 Grafana 进行日志检索,对 Loki 形成直观认识。

接下来,将进一步探索 Loki 日志栈在实际应用中的强大能力。具体而言,尝试纳管 Java 服务端的 Spring 日志,并重点关注日志的存储方案,特别是采用对象存储(Object Storage)的方式。这将有助于解决传统日志管理中存储成本高、扩展性差等问题,同时充分发挥 Loki 在分布式环境下的优势,为大规模集群的日志管理提供高效、可靠的解决方案。

关注微信公众号,获取运维资讯

如果此篇文章对你有所帮助,感谢你的点赞收藏,也欢迎在评论区友好交流。

微信搜索关注公众号:持续运维

参考

  1. Grafana Loki 概述,grafana.com/docs/loki/l…
  2. Grafana Loki 在 GitHub 上的开源仓库,github.com/grafana/lok…
  3. Loki 快速入门,grafana.com/docs/loki/l…
  4. Grafana Alloy,grafana.com/docs/alloy/…
  5. Grafana 日志下钻入门,grafana.com/docs/grafan…