目录
文章目录
- 目录
- 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“ 探索 按钮