windows实现Grafana+Loki+loki4j轻量级日志系统,告别沉重的ELK

文章目录

Loki下载

下载地址:https://github.com/grafana/loki/releases/

找到loki-windows-amd64.exe.zip点击开始下载,我这里下载的2.9.9版本

Grafana下载

下载地址:https://grafana.com/grafana/download?platform=windows

下载grafana-enterprise-11.1.0.windows-amd64.zip

安装Loki

将下载的loki-windows-amd64.exe.zip压缩包解压,得到loki-windows-amd64.exe文件,进入文件夹创建config文件夹,在config文件夹下创建配置文件:loki-config.yaml

注意:wal文件夹是运行Loki后自动生成的

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: F:/work/Loki/store/index
  filesystem:
    # 文件系统的存储路径
    directory: F:/work/Loki/store/chunks

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

运行Loki服务

cmd进入文件目录后执行命令

go 复制代码
loki-windows-amd64.exe --config.file=config/loki-config.yaml

运行Grafana服务

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

程序运行成功后访问:http://localhost:3000,初始账户: admin/admin 登录后需重置密码

添加Loki数据源






进入设置界面,添加Loki服务地址:http://localhost:3100, 在Header上添加X-Scope-OrgID参数,参数值可以自定义,默认tenant1, 然后点击save&test看看是否成功。

注:如果save&test报错可能是Loki服务初始化还未完成,验证Loki初始化是否完成访问:http://localhost:3100/ready,如果显示ready即初始化完成

springboot日志推送

pom文件添加依赖:

xml 复制代码
<!--Loki 日志收集-->
<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>

logback-spring.xml:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 彩色控制台控制 -->
    <substitutionProperty name="log.pattern" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) ${PID:-} %clr(---){faint} %clr(%-80.80logger{79}){cyan} %clr(:){faint} %m%n%wEx"/>
    <substitutionProperty name="log.pattern.no" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) ${PID:-} %clr(---){faint} %clr(%-80.80logger{79}){cyan} %clr(:){faint} %m%n%wEx"/>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <springProperty scope="context" name="LOG_FILE_DIR" source="logback.log-file-dir" defaultValue="log"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <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"/>

    <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>

    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern.no}</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_FILE_DIR}/info.%d.log</fileNamePattern>
            <!--保留30天日志-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${log.pattern.no}</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>${LOG_FILE_DIR}/error.%d.log</fileNamePattern>
            <!--保留30天日志-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="fileInfoLog" />
        <appender-ref ref="fileErrorLog" />
        <appender-ref ref="ASYNC_LOKI" />
    </root>

</configuration>

yml文件配置:

yaml 复制代码
# Loki 日志配置
loki:
  # Loki 服务的 URL,用于推送日志数据
  url: http://localhost:3100/loki/api/v1/push
  
  # 标签配置,用于标识日志来源的额外信息
  label:
    # 环境标签,标识当前运行的环境,例如开发环境
    env: dev
    # 服务名称标签,标识日志来源的服务名称
    job-name: my-service
    # 主机 IP 标签,标识日志来源的主机 IP 地址
    host-ip: 192.168.0.1
    
  # 组织 ID,用于多租户环境中标识日志所属的组织
  org-id: tenant1

运行springboot程序后日志都会发送到 Loki,就可以在 Grafana 查看了

相关推荐
懒羊羊不懒@5 小时前
JavaSe—泛型
java·开发语言·人工智能·windows·设计模式·1024程序员节
程序员霸哥哥11 小时前
卸载工具uninstall tool下载安装教程(附安装包)绿色版
windows·uninstall tool
女程序猿!!!17 小时前
视频分辨率
windows
不讲废话的小白17 小时前
文件拖不进企微了怎么办
windows·企微
聪明努力的积极向上18 小时前
【.net framework】WINDOWS服务和控制台程序简单介绍
windows·.net
Deamon Tree20 小时前
Prometheus和Grafana简介
grafana·prometheus
程序员霸哥哥1 天前
snipaste免费版下载安装使用教程(附安装包)
windows·microsoft·snipaste
程序员霸哥哥1 天前
Keil5下载教程及安装教程(附安装包)
windows·keil5·keil5下载教程·keil5安装教程
AI大模型学徒1 天前
Chatbox 安装 for Windows
windows·语言模型·chatgpt
千里马学框架1 天前
windows系统上aosp15上winscope离线html如何使用?
android·windows·html·framework·安卓窗口系统·winscope