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

前言

在云原生时代,日志管理作为系统可观测性的三大支柱之一,正经历着变革。传统 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。

与其他日志系统不同,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 替代。

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

Loki 教程【翻译】

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

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

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 分支:
shell 复制代码
git clone https://github.com/grafana/loki-fundamentals.git -b getting-started
  1. 进入目录 loki-fundamentals
shell 复制代码
cd loki-fundamentals
  1. loki-fundamentals使用 Docker Compose 将 Loki、Alloy 和 Grafana 部署为当前工作目录:
shell 复制代码
docker compose up -d

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

shell 复制代码
 ✔ 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 日志下钻页面。

如果仅部署了入门演示,则应该看到三个容器及其日志:

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

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

Loki 实践:Nginx 日志采集

本项目中使用 Promtail 采集日志

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

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


系统架构

lua 复制代码
+--------+    日志文件    +-----------+    推送日志    +--------+    查询日志    +-----------+
| Nginx  | ------------> | Promtail  | ------------> |  Loki  | <------------ | Grafana   |
+--------+               +-----------+               +--------+               +-----------+

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

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

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

  1. 本地磁盘:loki-nginx/logs/ -> access.log error.log
  1. Docker Desktop 容器内部:

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

  1. 通过 Grafana WebUI 检索

快速部署

克隆仓库 github 或 gitee

bash 复制代码
# git clone [email protected]:xiaolinstar/loki-nginx.git
git clone https://github.com/xiaolinstar/loki-nginx.git
bash 复制代码
# git clone [email protected]:xingxiaolin/loki-nginx.git
git clone https://gitee.com/xingxiaolin/loki-nginx.git

进入项目

bash 复制代码
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 秒后,确认所有服务都健康运行

arduino 复制代码
# docker ps
docker compose ps 

使用 Grafana WebUI 查看 Nginx 日志

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

访问 Nginx 网页

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

在浏览器中访问

一般匹配页:

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

在 Grafana 中查看

访问: http://localhost:9000

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

对比与思考

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

本章通过一个最简单的 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...
相关推荐
早起鸟儿4 小时前
docker-Dockerfile 配置
java·linux·运维·docker
虚妄狼4 小时前
【Docker Desktop】Windows11安装 Docker Desktop
运维·docker·容器
Hello.Reader5 小时前
NGINX 四层上游模块`ngx_stream_upstream_module` 实战指南
运维·nginx
IT成长日记5 小时前
【Docker基础】Docker核心概念:命名空间(Namespace)与资源隔离联系
运维·docker·namespace·资源隔离·命令空间
Mikhail_G5 小时前
Python应用八股文
大数据·运维·开发语言·python·数据分析
西西小飞龙6 小时前
Docker 基础使用
docker·容器·eureka
再ZzZ6 小时前
Docker安装PaddleOCR并提供接口服务(CPU)
运维·docker·容器
国际云,接待7 小时前
微软云注册被阻止怎么解决?
服务器·网络·microsoft·云原生·微软·云计算
love530love7 小时前
是否需要预先安装 CUDA Toolkit?——按使用场景分级推荐及进阶说明
linux·运维·前端·人工智能·windows·后端·nlp
m0_694845578 小时前
日本云服务器租用多少钱合适
linux·运维·服务器·安全·云计算