参考链接: 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 是一个代理,负责收集日志并将它们发送到 Loki。
  • Loki 是主要服务,负责存储日志和处理查询。
  • Grafana 用于查询和显示日志。

请注意,Alloy 替换了 Promtail 在栈中的位置,因为 Promtail 被认为是功能完整的,未来的日志收集开发将在 Grafana Alloy 中进行。

Loki 与 Prometheus 类似,但用于日志:我们倾向于使用多维度的基于标签的索引方法,并希望拥有一个易于运维、无依赖的单一代码包系统。 Loki 与 Prometheus 的不同之处在于它专注于日志而不是指标,并通过推送而非拉取的方式传递日志。

1.1 Loki日志系统的优势与特点

Loki 是由 Grafana Labs 开发的一个高度可扩展的日志聚合系统,它专为大规模日志管理和查询而设计。与传统的日志系统相比,Loki 具有以下显著优势:

  1. 轻量级:Loki 的设计非常简洁,不存储完整的日志行,而是将日志行拆分为标签和非结构化文本。这种设计大大减少了存储空间的需求,使得日志系统的运行更加高效。
  2. 高性能:Loki 使用了高效的索引机制,能够快速地查询和检索日志数据。即使在处理大量日志时,也能保持较低的延迟。
  3. 低成本:由于 Loki 不需要复杂的全文搜索功能,因此其硬件需求相对较低,降低了运维成本。同时,Loki 可以轻松地与现有的监控系统集成,如 Prometheus 和 Grafana,进一步提升了系统的整体价值。
  4. 易用性:Loki 提供了丰富的 API 和友好的用户界面,使得日志的管理和查询变得简单直观。无论是初学者还是经验丰富的开发人员,都能快速上手并高效地使用 Loki。
  5. 灵活性: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>

常见问题解决方案

  1. 检查项目依赖:确保在项目的 pom.xmlbuild.gradle 文件中正确引入了 Loki Logback Appender 的依赖。
  2. 版本兼容性:确认所使用的 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资讯 | 万维易源](

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐