Grafana Loki,轻量级日志系统

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
性能测试 PTS,5000VUM额度
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。

Hi~,各位读者朋友们,我是笠泱,感谢您阅读本文,本期分享基于Grafana+Loki+Alloy构建轻量级日志系统。本期内容灵感来源于B站@雷丰阳直播课(B站:https://www.bilibili.com/video/BV17ZyKYeEPh;雷神个人语雀:https://www.yuque.com/leifengyang

本期导语

在生产实际中对日志的采集、加工、存储、检索、分析、可视化、监控告警等是不可缺失的,这就需要一套较为完整且统一的日志平台,一般而言企业会进行如下选择:

  • 若企业IT系统已上云一般会选择云厂商自带的日志系统,比如阿里云的日志服务SLS(官网:https://help.aliyun.com/zh/sls)等等;
  • 基于开源解决方案自建或二次开发的日志系统,比如ELK、Flume+Hadoop+Flink+Spuerset、ClickHouse等等;

顺便提一下阿里云的SLS产品功能确实挺强大,在创建索引前提下,能够对日志编写SQL和SPL(SLS产品自定义的分析处理语法)分析聚合日志并实现多样可视化以及告警等功能。所以笔者就寻思除了传统的EKL方案,是否还有更轻量级又能编写类似SQL语法的开源代替方案呢?毕竟如今的云原生生态如此庞大,总有优秀的开源代替方案,所以本期笔者来分享一套基于Grafana+Loki+Alloy构建轻量级日志系统。

Loki

Loki是什么?

咱们先看Grafana官网(https://grafana.com/docs/loki/latest/get-started/overview/)原文定义描述:“Loki is a horizontally scalable, highly available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost effective and easy to operate. It does not index the contents of the logs, but rather a set of labels for each log stream.

翻译拓展即:Loki 项目于 2018 年在 Grafana Labs 启动,是Grafana生态的一部分,Loki 是一个可水平扩展、高可用性、多租户日志聚合系统,其灵感来自 Prometheus。与 Prometheus 的不同之处在于,它专注于日志而不是指标,并通过推送而不是拉取来收集日志。Loki 的设计非常经济高效,并且具有高度可扩展性。与其他日志系统不同,Loki 不会对日志内容进行索引,而只会对日志的元数据进行索引,将其作为每个日志流的一组标签。

日志流是一组共享相同标签的日志。标签帮助Loki在您的数据存储中找到日志流,因此拥有一组高质量的标签是高效查询执行的关键。然后,日志数据被压缩并以块的形式存储在对象存储中,如亚马逊简单存储服务(S3)或谷歌云存储(GCS),甚至为了开发或概念验证,存储在文件系统上。小索引和高度压缩的块简化了操作,显著降低了Loki的成本。

那为什么说Loki是一个轻量级日志系统呢?这里的轻量级不是说Loki的功能小,是而相对于传统的ELK方案而言,ELK是基于Java语言开发,由于GC机制天生占用内存资源大,而Grafana Labs提供的这套Loki基于Go语言开发,天生占用内存资源相对较低,在相同配置服务器情况运行起来更为轻量级,当然前文提到Loki 不会对日志内容进行索引,而只会对日志的元数据进行索引,这也是轻量级的一种表现,节省了不少的日志存储空间。

Loki的数据存储格式

Grafana Loki 有两种主要的文件类型:

○ index:索引;存储Loki标签,如日志级别、来源、分组

 ○ chunk:块;存储日志条目本身

上图源于https://grafana.com/docs/loki/latest/get-started/architecture/

Loki的架构

上图源于https://grafana.com/docs/loki/latest/get-started/overview/

一个典型的基于 Loki 的日志系统由 3 个组件组成:

Agent:代理或客户端,例如Grafana Alloy或Promtail,随Loki一起分发。代理抓取日志,通过添加标签将日志转换为流,并通过HTTP API将流推送到Loki。

Loki主服务器:负责摄取和存储日志以及处理查询。它可以部署在三种不同的配置中,有关更多信息,请参阅部署模式。

Grafana:用于查询和显示日志数据。您还可以使用LogCLI或直接使用Loki API从命令行查询日志。

Loki的工作流程

上图源于https://grafana.com/docs/loki/latest/get-started/architecture/

写流程

  1. distributor 接收带有流和日志行的HTTP POST请求。
  2. distributor 会 hash 计算请求中包含的每个流,决定发给 一致性 hash 环 中的哪个 ingester
  3. distributor 把每个流 发给合适处理它的 ingester 和其副本
  4. ingester 接收带有日志行的流,并为流的数据创建一个块或附加到现有块。每个租户和每个标签集,块都是唯一的
  5. ingester 回复写操作结果
  6. distributor 等待大多数 ingester 确认写入完成。
  7. distributor 在收到至少法定数量的确认写入时响应成功(2xx状态码)。或者在写入操作失败时响应错误(4xx或5xx状态码)。

读流程

  1. 查询前端(query frontend) 接受到 携带 LogQL 的 HTTP GET 请求
  2. 查询前端 将查询拆分为子查询并将它们传递给查询调度程序(query scheduler)。
  3. querier (查询器)从调度程序(scheduler)中提取子查询。
  4. querier 将查询传递给 所有保存数据的 ingester
  5. ingester 返回与查询匹配的 记忆数据(如果有)。
  6. 如果 ingester 没有返回或返回的数据不足,querier 会延迟从后备存储加载数据并对其运行查询。
  7. querier 遍历所有接收到的数据并进行重复数据删除,将子查询的结果返回到查询前端。
  8. 查询前端 等待 查询的所有子查询完成 并由 querier 返回。
  9. 查询前端将两个结果合并为最终结果并将其返回给客户端。

Alloy

Alloy的架构

上图源于https://grafana.com/docs/alloy/latest/introduction/

Grafna官网对Alloy的定义描述原文:“Alloy is a flexible, high performance, vendor-neutral distribution of the OpenTelemetry Collector. It’s fully compatible with the most popular open source observability standards such as OpenTelemetry and Prometheus.

翻译拓展即:Grafana Alloy是一个多功能的可观测性收集器,也是Grafana生态的一部分,可以摄取各种格式的日志并将其发送到Loki。推荐Alloy作为向Loki发送日志的主要方法,因为它为构建高度可扩展和可靠的可观测性流水线提供了更强大和特征丰富的解决方案。

Alloy的组件

快速搭建

参阅Grafana官网文档https://grafana.com/docs/loki/latest/get-started/quick-start/,我们可以用Docker Compose 部署以下服务,快速体验Loki生态:

  • flog:生成日志行。flog是常见日志格式的日志生成器。
  • Grafana Alloy:它从flog上抓取日志线,并通过网关将它们推送到Loki。
  • 网关(nginx):接收请求并根据请求的URL将它们重定向到适当的容器。
  • Loki read组件:它运行一个查询前端和一个查询器。
  • Loki write组件:它运行一个分发器和一个Ingester。
  • Loki 后端组件:它运行索引网关、压缩器、标尺、Bloom压缩器(实验)和Bloom网关(实验)。
  • Minio:Loki用来存储其索引和块。
  • Grafana:它提供了在Loki中捕获的日志行的可视化。

上图源于https://grafana.com/docs/loki/latest/get-started/quick-start/

准备

# 1、准备目录
mkdir evaluate-loki
cd evaluate-loki
# 2、下载默认配置文件
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/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

部署

docker compose up -d

注:由于某些限制,Docker官方镜像仓库在国内访问受阻,导致拉取镜像失败,解决方案可以使用“魔法”,对于没条件使用“魔法”的读者朋友,笔者推荐您使用国内镜像加速和代理解决方案,详细配置可参照https://cloud.tencent.com/developer/article/2485043 该文档的作者在长期维护更新

验证

待所有容器都处于Up且healthy状态,可通过docker ps命令查看

Read组件: http://your_server_IP:3101/ready

Write组件:http://your_server_IP:3102/ready

Grafana Alloy UIhttp://your_server_IP:12345

预期如下:

Grafana

查看日志

可以使用LogCli或者Grafana可视化界面查看日志

使用 Grafana 查询 Loki 数据源的数据

  • 访问Grafana:http://your_server_IP:3000/
  • 已经整合了Loki数据源
  • 点击 Explore 查看
  • 使用Code模式,编写 LogQL 查询

查询示例:

标签检索

# 比如我们要查看 container 标签值 为 evaluate-loki-flog-1 的日志
{container="evaluate-loki-flog-1"}
{container="evaluate-loki-grafana-1"}

包含值

# 查看 container 标签值 为 evaluate-loki-flog-1 ,且 json 格式中 status字段值为404
{container="evaluate-loki-flog-1"} | json | status=`404`

计算

sum by(container) (rate({container="evaluate-loki-flog-1"} | json | status=`404` [$__auto]))

其他

{container="evaluate-loki-flog-1"}
{container="evaluate-loki-flog-1"} |= "GET"
{container="evaluate-loki-flog-1"} |= "POST"
{container="evaluate-loki-flog-1"} | json | method="POST"
{container="evaluate-loki-flog-1"} | json | status="401"
{container="evaluate-loki-flog-1"} != "401"

更多 LogQL 语法请参阅:https://grafana.com/docs/loki/latest/query/

本期总结

本期内容简要介绍了基于Grafana+Loki+Alloy构建的开源日志系统的架构、快速入门,希望为大家在做日志采集监控分析场景需求时提供参考解决方案。

通过本期文章,笔者想再发散讲一下有关架构的内容,从Loki这套系统架构细心的读者可能发现Loki既能做write组件也能做reader组件还能做backend组件,Loki本身是一个融合了多个模块的单体应用,但它可以根据所需功能解耦,可以进行分布式部署,从部署层面看最终呈现出一些微服务特征。


其实上述,笔者想引出一种介于单体和微服务之间的另一种架构风格“巨型单体模块化”,即同一个应用封装了某个业务场景的多种功能模块,可单体部署也可分布式部署,分布式部署后整体协同实现了单体全部功能,这类架构风格可以进一步抽象出一种架构思想:“部分即整体,拥有自相似性”,这是一种可行且美妙的架构思想,其美妙程度不亚于数学中的分形,当然“巨型单体模块化”目前仅适用于某些特定业务场景,其也会带来一些挑战,比如在一个单体中融入太多模块,过于巨型臃肿,资源占用,代码重复率,耦合度增加,模块之间依赖等问题,可能还得引入可插拔技术工具去解耦,但这无疑增加了复杂度,但至少提供了一种软件架构思路。

最后,感谢您的阅读!系列文章会同步在微信公众号@云上的喵酱、阿里云开发者社区@云上的喵酱、CSDN@笠泱 更新,您的点赞+关注+转发是我后续更新的动力!

相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
目录
打赏
0
70
69
2
149
分享
相关文章
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
93 8
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
125 2
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
385 2
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
26 5
图解MySQL【日志】——Redo Log
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
1070 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
101 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
5月前
|
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
517 3
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
105 7
MySQL事务日志-Undo Log工作原理分析
图解MySQL【日志】——Undo Log
Undo Log(回滚日志)是 MySQL 中用于实现事务原子性和一致性的关键机制。在默认的自动提交模式下,MySQL 隐式开启事务,每条增删改语句都会记录到 Undo Log 中。其主要作用包括:
25 0

相关产品

  • 可观测可视化 Grafana 版