轻量级日志管理系统SpringBoot3+Loki+grafana的使用实例

news2024/12/29 10:16:27

目录

文章目录

  • 目录
  • 1、简介
  • 2、SpringBoot3应用发送日志到Loki
    • 2.1、基本介绍
    • 2.2、添加依赖
    • 2.3、配置文件application.yml
    • 2.4、创建logback配置
    • 2.5、添加日志示例
    • 2.6、运行SpringBoot3
  • 3、在grafana中查看日志
    • 3.1、登录grafana
    • 3.2、查询日志
    • 3.3、查询我们的SpringBoot发送过来的日志
    • 3.4、按日志级别查询
    • 3.5、按主机查询

1、简介

通过集成日志工具Loki+Promtail使得能够自动化采集日志。

Grafana作为可视化终端,通过链接Loki数据源,能够对采集的日志进行搜索和分析。

其中:

  • Loki: 日志聚合工具,类似ELK中Elasticsearch

  • Promtail: 日志收集工具,类比ELK中的Logstash

  • Grafana:可视化工具,类比ELK中Kibana

效果图
在这里插入图片描述

2、SpringBoot3应用发送日志到Loki

2.1、基本介绍

通过在SpringBoot3中配置logback,主要的配置是使用logback-spring.xml文件配置日志发送到loki

2.2、添加依赖

       <!-- logstash-logback-encoder -->
		<dependency>
			<groupId>net.logstash.logback</groupId>
			<artifactId>logstash-logback-encoder</artifactId>
			<version>7.4</version>
		</dependency>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
		</dependency>


		<!-- loki-logback-appender -->
		<dependency>
			<groupId>com.github.loki4j</groupId>
			<artifactId>loki-logback-appender</artifactId>
			<version>1.5.0</version>
		</dependency>

2.3、配置文件application.yml

这里注意是配置一个 spring.application.name 在logback中使用,发送到Loki中以后方便标识

spring:
  application:
    name: Taxsoft_SpringBoot3_Loki

2.4、创建logback配置

在项目的资料目录创建: src\main\resources\logback-spring.xml

(1)指定loki服务器URL地址http://localhost:3100

(2)Loki不索引日志的内容,而只索引元数据标签。有一些静态标签,如应用程序名称、日志级别或主机名。我们可以在format.label字段中设置它们。

(3)设置一些动态标签,因为我们启用了Logback标签功能。

(4)设置日志格式模式。

为了简化LogQL(Loki查询语言)的潜在转换,我们将使用JSON表示法。

内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--  配置App日志的名称  -->
    <springProperty name="name"  source="spring.application.name"/>

    <!--  配置控制台输出  -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} %X{X-Request-ID} - %msg%n
            </pattern>
        </encoder>
    </appender>


    <!-- 配置loki4j   -->
    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <!-- 1、 指定loki服务器URL-->
        <http>
            <url>http://172.23.1.235:3100/loki/api/v1/push</url>
        </http>
        <format>
            <!-- 2、 配置标签 -->
            <label>
                <pattern>app=${name},host=${HOSTNAME},level=%level</pattern>
                <!-- 3、读取标记-->
                <readMarkers>true</readMarkers>
            </label>
            <message>
                <!-- 4、格式-->
                <pattern>
                    {
                    "level":"%level",
                    "class":"%logger{36}",
                    "thread":"%thread",
                    "message": "%message",
                    "requestId": "%X{X-Request-ID}",
                    "datetime": "%d{yyyy-MM-dd HH:mm:ss.SSS}"
                    }
                </pattern>
            </message>
        </format>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="LOKI"/>
    </root>

</configuration>

2.5、添加日志示例

除了静态标签,我们还可以发送动态数据,例如仅针对当前请求的特定数据。假设我们有一个管理人员的服务,我们希望记录请求中目标人员的id。正如我之前提到的,使用Loki4j,我们可以使用Logback标记。在经典的Logback中,标记主要用于过滤日志记录。使用Loki,我们只需要定义LabelMarker对象:

(1)该对象包含动态字段的键/值映射。

(2)然后我们将对象传递到当前日志行。

和以前的使用方式一样

我这里写了一个控制器

package com.ts.controller;

import com.github.loki4j.slf4j.marker.LabelMarker;
import lombok.extern.java.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//@Log
@RestController
public class MainController {

    private static final Logger log = LoggerFactory.getLogger(MainController.class);

    @RequestMapping("/")
    public String index() {
        log.info("这是一条info信息消息");
        log.error("This is an error message");

        return "Hello";
    }

    @RequestMapping("/test")
    public String test() {

        log.warn("这是一条警告信息。。。。");

        //动态标签
        //动态字段的键/值映射
        LabelMarker marker = LabelMarker.of("personId", () ->
                String.valueOf(1001));
        //将对象传递到当前日志行
        log.info(marker,"用户已成功更新");

        return "Test LabelMarker";
    }
}


2.6、运行SpringBoot3

启动SpringBoot3,然后访问 我们添加日志的路径: http://localhost:8080/

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.3)

15:59:10.491 INFO  com.ts.Springboot3LokiApplication  - Starting Springboot3LokiApplication using Java 20.0.1 with PID 15984 (D:\IdeaProjects\springboot3_loki\target\classes started by Somken in D:\IdeaProjects\springboot3_loki)
15:59:10.498 INFO  com.ts.Springboot3LokiApplication  - No active profile set, falling back to 1 default profile: "default"
15:59:11.243 INFO  o.s.b.w.e.tomcat.TomcatWebServer  - Tomcat initialized with port 8080 (http)
15:59:11.252 INFO  o.a.coyote.http11.Http11NioProtocol  - Initializing ProtocolHandler ["http-nio-8080"]
15:59:11.254 INFO  o.a.catalina.core.StandardService  - Starting service [Tomcat]
15:59:11.254 INFO  o.a.catalina.core.StandardEngine  - Starting Servlet engine: [Apache Tomcat/10.1.19]
15:59:11.298 INFO  o.a.c.c.C.[Tomcat].[localhost].[/]  - Initializing Spring embedded WebApplicationContext
15:59:11.299 INFO  o.s.b.w.s.c.ServletWebServerApplicationContext  - Root WebApplicationContext: initialization completed in 757 ms
15:59:11.618 INFO  o.a.coyote.http11.Http11NioProtocol  - Starting ProtocolHandler ["http-nio-8080"]
15:59:11.629 INFO  o.s.b.w.e.tomcat.TomcatWebServer  - Tomcat started on port 8080 (http) with context path ''
15:59:11.637 INFO  com.ts.Springboot3LokiApplication  - Started Springboot3LokiApplication in 1.912 seconds (process running for 2.551)
15:59:54.368 INFO  o.a.c.c.C.[Tomcat].[localhost].[/]  - Initializing Spring DispatcherServlet 'dispatcherServlet'
15:59:54.369 INFO  o.s.web.servlet.DispatcherServlet  - Initializing Servlet 'dispatcherServlet'
15:59:54.370 INFO  o.s.web.servlet.DispatcherServlet  - Completed initialization in 1 ms
15:59:54.405 INFO  com.ts.controller.MainController  - 这是一条info信息消息
15:59:54.405 ERROR com.ts.controller.MainController  - This is an error message

提示:只有访问过了这个方法,才能产生日志

3、在grafana中查看日志

3.1、登录grafana

打开grafana:http://172.23.1.235:3000/
在这里插入图片描述

登录进去以后界面如下
在这里插入图片描述

3.2、查询日志

点击左侧的 ”explore“ 探索 按钮
在这里插入图片描述
在这里插入图片描述

3.3、查询我们的SpringBoot发送过来的日志

在这里插入图片描述

3.4、按日志级别查询

在这里插入图片描述

3.5、按主机查询

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux部署python web项目Flask + gunicorn + nginx

文章目录 一、安装python&使用虚拟环境二、python程序重要参数加密2.1 非对称加密&#xff08;RSA&#xff09;2.2 生成密钥对2.4 以连接数据库参数加密为例2.4.1 工具类RSA.py 三、一个简单的Flask项目四、安装配置gunicorn4.1 安装4.2 启动/配置(选择eventlet)4.2.1 命令…

随机信号介绍

一、信号分类 1.1 确定性信号 能够以确定的时间函数表示的信号,比如: 1.2 随机信号 也成为不确定信号或者随机过程,不是时间的确定函数。下面为随机信号的一个样本: 二、随机变量 2.1 定义 随机变量是指变量X的取值由每次随机试验的结果决定。 如果每次随机试验的结果…

JS封装函数转换时间案例

<script>let time prompt("请输入需要转换的秒数总数")function getTime(x) {let h parseInt(x / 60 / 60 % 60)let m parseInt(x / 60 % 60)let s parseInt(x % 60)h h > 10 ? h : 0 hm m > 10 ? m : 0 ms s > 10 ? s : 0 sreturn [h, …

CorePress Pro 网站加载慢 WordPress

一般来说是你用了「CorePress天气模块」 解决方案&#xff1a;这个插件从你右侧边栏里删掉就可以了&#xff08;上方的图中已经是删掉后的效果了&#xff09; 寻找加载时间长的原因&#xff1a; 谷歌浏览器F12->网络->打开录制->ShiftF5 得出结论&#xff1a;和风天气…

【JavaEE】数据链路层协议和DNS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f45c;一.以太网 以太网&#xff08;Ethernet&#xff09;是一种局域网技术&#xff0c;它定义了开放系统互连&#xff08;OSI&#xff09;模型中的物理…

【Pytorch图像+序列双输入网络源代码】

Python&#xff0c;Pytorch构建双输入网络&#xff0c;图像序列双输入&#xff0c;进行二分类。 如何基于Pytorch构建双输入的网络是曾经长时间困扰本人的问题&#xff0c;现已弄明白。本程序示例是一端输入图像&#xff0c;一端输入序列。 整体工作如下&#xff1a; 1、加载数…

CSS清除浮动的多种方法

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 给浮动元素的祖先元素加高度 给 div 写一个 clear:both; 属性(margin 失效) clear:both; 隔墙法 clear:both; 内墙法 父级 div 定义伪类:after 和 zoom(推荐使用) overflow:hidden;(能够让 margin 生效) 非 …

机器学习-KNN分类算法

1.1 KNN分类 KNN分类算法&#xff08;K-Nearest-Neighbors Classification&#xff09;&#xff0c;又叫K近邻算法。它是概念极其简单&#xff0c;而效果又很优秀的分类算法。1967年由Cover T和Hart P提出。 KNN分类算法的核心思想&#xff1a;如果一个样本在特征空间中的k个最…

【机器学习】——线性回归(自我监督学习)

文章目录 1. 线性回归的定义2. 线性回归的模型3. 线性回归的核心思想4. 线性回归的求解5. 线性回归的假设6. 模型评估7. 线性回归的优缺点8. 线性回归的扩展9. 线性回归的实际应用10. 示例代码&#xff08;Python实现&#xff09; 线性回归详细介绍 1. 线性回归的定义 线性回归…

【已解决】Ubuntu 24.04 修改 ssh 连接端口无效

用编辑器打开 /etc/ssh/sshd_config 文件 sudo vim /etc/ssh/sshd_config将 Port 22 改为你想要的端口号&#xff08;这里演示就设置为4080&#xff09; 用编辑器打开 /lib/systemd/system/ssh.socket 文件 sudo vim /lib/systemd/system/ssh.socket将 ListenStream22 中的 2…

Windows 10 系统安装 FFmpeg 查看、转换、编辑音频文件

1、FFmpeg官网&#xff1a;FFmpeg 点击下载 可以选择下载full版本 下载之后解压到指定目录&#xff0c;在系统环境变量 Path 里面新增环境变量 打开CMD终端运行 ffmpeg -version 查看是否安装成功。 2、基本命令 查看音频基本信息 ffprobe 1.mp3 ##输出 [mp3 000002ab334405…

Xcode16 iOS18 编译问题适配

问题1&#xff1a;ADClient编译报错问题 报错信息 Undefined symbols for architecture arm64:"_OBJC_CLASS_$_ADClient", referenced from:in ViewController.o ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit co…

<Java>String类型变量的使用

两边有一个string就是连接&#xff0c;否则做加法 ‘ ’是char&#xff0c;“ ”是string&#xff0c;char能做加法&#xff0c;string只能连接

STM32F407_05

RTC实时时钟 主要特性: 由于RTC实时时钟提供了三种时钟源可供选择(LSI,LSE,HSE) ,一般我们选择低速外部时钟源(32.768KHZ)来作为RTC的时钟源 另外&#xff0c;RTC实时时钟可以由系统主电源供电&#xff0c;但是也可以由备份电源供电&#xff08;系统主电源不工作时&#xff09…

微电网与大电网主动同步控制

前言 大电网正常运行时&#xff0c;微电网通过大电网得到正常的电压频率参数支撑&#xff0c;大电网故障时&#xff0c;微电网的电压和频率支撑需要通过分布式电源提供&#xff0c;从而保持自身独立运行。分布式电源提供的电压信息会因为自身的下垂特性随本地负荷的改变不断变…

leetcode331. 验证二叉树的前序序列化

序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上面的二叉树可以被序列化为字符串 "9,3,4,#,#,1,#,#,2,#,…

【含文档】基于Springboot+Vue的高校师资管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

构建高效线上培训体系的知识库策略

在数字化时代&#xff0c;线上培训已成为企业提升员工技能、促进知识传递的重要手段。然而&#xff0c;如何构建一个高效、系统的线上培训体系&#xff0c;确保培训内容的准确性与时效性&#xff0c;是许多企业面临的共同挑战。其中&#xff0c;知识库作为培训资源的核心载体&a…

Arduino中实现定时器中断

1、使用MsTimer2库文件 使用之前需要先添加库 &#xff08;1&#xff09;实现功能 &#xff08;2&#xff09;代码 /*MsTimer2 is a small and very easy to use library to interface Timer2 withhumans. Its called MsTimer2 because it "hardcodes" a resolutio…

99页PPT | 智慧城市运营大数据平台解决方案

方案内容综述 这是一套综合性的解决方案&#xff0c;旨在通过先进的数据分析和处理技术&#xff0c;提升城市管理的智能化水平。平台基于运营商的运营理论构建&#xff0c;通过整合城市各个层面的数据资源&#xff0c;实现对城市运行状态的全面监测、分析和优化。 城市大数据公…