轻量级日志管理系统SpringBoot3+Loki+grafana的使用实例
目录
文章目录
- 目录
- 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“ 探索 按钮