springboot+Loki+Loki4j+Grafana搭建轻量级日志系统
参考链接: springboot+Loki+Loki4j+Grafana搭建轻量级日志系统_springboot loki-CSDN博客Loki 是一个受 Prometheus 启发的水平可扩展、高可用、多租户日志聚合系统。 它被设计成非常经济高效且易于运维。 Loki 并不索引日志内容,而是索引每个日志流的标签集合。与其它日志聚合系统相比,Loki 具有以下特点:基于 Loki 的日志栈由三个组
参考链接: springboot+Loki+Loki4j+Grafana搭建轻量级日志系统_springboot loki-CSDN博客
Loki:类似 Prometheus,但用于日志
Loki 是一个受 Prometheus 启发的水平可扩展、高可用、多租户日志聚合系统。 它被设计成非常经济高效且易于运维。 Loki 并不索引日志内容,而是索引每个日志流的标签集合。
与其它日志聚合系统相比,Loki 具有以下特点:
- 不对日志进行全文索引。通过存储压缩的、非结构化的日志并仅索引元数据,Loki 更易于运维,运行成本更低。
- 使用与 Prometheus 相同的标签来索引和分组日志流,使您能够无缝地在指标和日志之间切换,使用您已经在 Prometheus 中使用的相同标签。
- 特别适合存储 Kubernetes Pod 日志。Pod 标签等元数据会自动收集并索引。
- 在 Grafana(需 Grafana v6.0)中拥有原生支持。
基于 Loki 的日志栈由三个组件组成:
请注意,Alloy 替换了 Promtail 在栈中的位置,因为 Promtail 被认为是功能完整的,未来的日志收集开发将在 Grafana Alloy 中进行。
Loki 与 Prometheus 类似,但用于日志:我们倾向于使用多维度的基于标签的索引方法,并希望拥有一个易于运维、无依赖的单一代码包系统。 Loki 与 Prometheus 的不同之处在于它专注于日志而不是指标,并通过推送而非拉取的方式传递日志。
1.1 Loki日志系统的优势与特点
Loki 是由 Grafana Labs 开发的一个高度可扩展的日志聚合系统,它专为大规模日志管理和查询而设计。与传统的日志系统相比,Loki 具有以下显著优势:
- 轻量级:Loki 的设计非常简洁,不存储完整的日志行,而是将日志行拆分为标签和非结构化文本。这种设计大大减少了存储空间的需求,使得日志系统的运行更加高效。
- 高性能:Loki 使用了高效的索引机制,能够快速地查询和检索日志数据。即使在处理大量日志时,也能保持较低的延迟。
- 低成本:由于 Loki 不需要复杂的全文搜索功能,因此其硬件需求相对较低,降低了运维成本。同时,Loki 可以轻松地与现有的监控系统集成,如 Prometheus 和 Grafana,进一步提升了系统的整体价值。
- 易用性:Loki 提供了丰富的 API 和友好的用户界面,使得日志的管理和查询变得简单直观。无论是初学者还是经验丰富的开发人员,都能快速上手并高效地使用 Loki。
- 灵活性:Loki 支持多种数据源和输出格式,可以轻松地与其他工具和服务集成。例如,通过 Loki4j,开发者可以在 Java 应用中轻松地将日志发送到 Loki 服务器。
部署模式
(1)可扩展部署模式
Loki 的简单可扩展部署模式是最简单的部署方式、首选方式。可扩展到每天几TB的日志,但是如果超出这个范围,建议部署微服务模式。
简单可扩展部署模式是将执行路径分为读取、写入和后端目标。这些目标可以独立扩展,让您可以自定义 Loki 部署,以满足日志摄取和日志查询的业务需求,从而使您的基础设施成本更好地匹配 Loki 的使用方式。
(2)单片模式
最简单的操作模式是单体部署模式。您可以通过设置-target=all命令行参数来启用整体模式。此模式每天最多约 20GB 的小型读/写量非常有用。
(3)微服务模式
微服务部署模式将 Loki 的组件作为不同的进程运行。每个进程的调用都指定其 target。
将组件作为单独的微服务运行可提供更大的粒度,让您可以将每个组件扩展为单独的微服务,以更好地匹配您的特定用例。
微服务模式部署可以使 Loki 安装更加高效。然而,它们的设置和维护也是最复杂的。
微服务模式仅建议用于非常大的 Loki 集群或需要更精确地控制扩展和集群操作的操作员。
微服务模式专为 Kubernetes 部署而设计。
Loki 下载地址 Releases · grafana/loki · GitHub

把下载的loki-windows-amd64.exe.zip压缩包解压,得到loki-windows-amd64.exe文件,进入这个文件中可以看到有一个可执行的程序(不用去点,点了也会闪退),创建一个config文件夹

再进入config文件夹中,创建loki-config.yaml配置文件,文件内容如下:
server:
# Loki 服务监听的 HTTP 端口号
http_listen_port: 3100
schema_config:
configs:
- from: 2024-07-01
# 使用 BoltDB 作为索引存储
store: boltdb
# 使用文件系统作为对象存储
object_store: filesystem
# 使用 v11 版本的 schema
schema: v11
index:
# 索引前缀
prefix: index_
# 索引周期为 24 小时
period: 24h
ingester:
lifecycler:
# 设置本地 IP 地址
address: 127.0.0.1
ring:
kvstore:
# 使用内存作为 kvstore
store: inmemory
# 复制因子设置为 1
replication_factor: 1
# 生命周期结束后的休眠时间
final_sleep: 0s
# chunk 的空闲期为 5 分钟
chunk_idle_period: 5m
# chunk 的保留期为 30 秒
chunk_retain_period: 30s
storage_config:
boltdb:
# BoltDB 的存储路径
directory: D:\software\loki-windows-amd64.exe\BoltDB
filesystem:
# 文件系统的存储路径
directory: D:\software\loki-windows-amd64.exe\fileStore
limits_config:
# 不强制执行指标名称
enforce_metric_name: false
# 拒绝旧样本
reject_old_samples: true
# 最大拒绝旧样本的年龄为 168 小时
reject_old_samples_max_age: 168h
# 每个用户每秒的采样率限制为 32 MB
ingestion_rate_mb: 32
# 每个用户允许的采样突发大小为 64 MB
ingestion_burst_size_mb: 64
chunk_store_config:
# 最大可查询历史日期为 28 天(672 小时),这个时间必须是 schema_config 中 period 的倍数,否则会报错
max_look_back_period: 672h
table_manager:
# 启用表的保留期删除功能
retention_deletes_enabled: true
# 表的保留期为 28 天(672 小时)
retention_period: 672h
注意yaml文件中的 BoltDB 的存储路径和 文件系统的存储路径,这个自行替换为自己的路径
yaml文件内容保存好后,使用cmd进入 loki-windows-amd64.exe可执行程序所在目录下,执行下面的启动命令(这个启动命令是以后启动Loki组件的专用命令,指定了配置文件)
log
loki-windows-amd64.exe --config.file=config/loki-config.yaml
下面的这几个文件夹都是根据配置自动生成的

windows注册成服务运行

Grafana下载安装运行
下载地址: Download Grafana | Grafana Labs

把下载后的压缩文件夹grafana-enterprise-11.1.0.windows-amd64.zip解压得到grafana-v11.1.0文件,进入bin目录找到grafana-server.exe程序双击运行

会自动弹出一个cmd窗口,打印出花花绿绿的日志信息,很好看
注册成windows服务


程序运行成功后
程序运行成功后访问:http://localhost:3000,初始账户: admin/admin 登录后需重置密码,笔者没有改变密码,还是使用原来的,下面是登录进去后的操作




spirngboot集成
pom
<!--Loki 日志收集 jdk8 选择-->
<dependency>
<groupId>com.github.loki4j</groupId>
<artifactId>loki-logback-appender-jdk8</artifactId>
<version>1.5.1</version>
</dependency>
<!--Loki 日志发送http请求和响应工具-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>

yml配置
# Loki 日志配置
loki:
# Loki 服务的 URL,用于推送日志数据
url: http://localhost:3100/loki/api/v1/push
# 标签配置,用于标识日志来源的额外信息
label:
# 环境标签,标识当前运行的环境,例如开发环境
env: dev
# 服务名称标签,标识日志来源的服务名称
job-name: my-service
# 主机 IP 标签,标识日志来源的主机 IP 地址
host-ip: localhost
# 组织 ID,用于多租户环境中标识日志所属的组织
org-id: user1
logback配置
<!-- Loki配置 -->
<springProperty scope="context" name="url" source="loki.url" defaultValue="http://localhost:3100/loki/api/v1/push"/>
<springProperty scope="context" name="env" source="loki.label.env" defaultValue="dev"/>
<springProperty scope="context" name="jobName" source="loki.label.job-name" defaultValue="my-app"/>
<springProperty scope="context" name="hostIp" source="loki.label.host-ip" defaultValue="localhost"/>
<springProperty scope="context" name="orgId" source="loki.org-id" defaultValue="default-org"/>
<!-- Loki配置 -->
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http class="com.github.loki4j.logback.ApacheHttpSender">
<url>${url}</url>
<tenantId>${orgId}</tenantId>
</http>
<format>
<label>
<pattern>application=${jobName},env=${env},host=${hostIp},level=%level</pattern>
</label>
<message>
<pattern>
{"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}", "level": "%level", "logger": "%logger{36}", "thread": "%thread", "message": "%msg%n"}
</pattern>
</message>
<sortByTime>true</sortByTime>
</format>
</appender>
<!-- 使用异步方式将日志推送至Loki -->
<appender name="ASYNC_LOKI" class="ch.qos.logback.classic.AsyncAppender">
<!-- 队列大小设置,根据实际需要调整 -->
<queueSize>512</queueSize>
<!-- 丢弃策略,当队列满时采取的操作 -->
<discardingThreshold>0</discardingThreshold>
<neverBlock>true</neverBlock>
<!-- 实际的Loki Appender -->
<appender-ref ref="LOKI" />
</appender>
<root level="info">
<!-- Loki配置补充上 -->
<appender-ref ref="ASYNC_LOKI" />
</root>
常见问题解决方案
- 检查项目依赖:确保在项目的
pom.xml或build.gradle文件中正确引入了 Loki Logback Appender 的依赖。 - 版本兼容性:确认所使用的 Loki Logback Appender 版本与项目中其他依赖库的版本兼容。
性能问题
问题描述:在生产环境中,新手可能会遇到日志记录性能问题,导致系统响应变慢或资源占用过高。
解决步骤:
优化日志级别:根据实际需求,合理设置日志级别,避免不必要的日志记录。
批量发送日志:配置 Loki Logback Appender 以批量发送日志,减少网络请求次数,提高性能。
监控和调优:使用性能监控工具,实时监控日志记录的性能指标,根据监控结果进行调优。
为什么不安装Promtail
Loki4j是一个Java日志库(支持Logback/Log4j),它允许Spring Boot应用直接将日志推送到Loki服务器,无需通过Promtail转发。
Promtail的定位是日志采集代理,主要用于从日志文件中提取数据(如容器日志、系统日志),而Loki4j直接在应用层完成日志发送,属于两种不同的数据采集方式。
参考资料
Grafana+Loki使用文档_grafana loki日志怎么使用-CSDN博客
[轻量化Java日志系统构建指南:从Loki到Grafana的完整解决方案-易源AI资讯 | 万维易源](
更多推荐


所有评论(0)