SpringBoot 3.2.0 基于Logback定制日志框架

依赖版本

  • JDK 17
  • Spring Boot 3.2.0

工程源码:Gitee

日志门面和日志实现

日志门面(如Slf4j)就是一个标准,同JDBC一样来制定“规则”,把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口。而Logback、log4j等具体的日志系统就如同MySQL驱动、PGSQL驱动一样,才是日志功能的真正实现。

img

SpringBoot默认日志框架

SpringBoot使用Slf4j作为日志门面,Logback作为默认的日志实现。在SpringBoot的pom.xml中,依赖为:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
</dependency>

此依赖在SpringBoot Starter包中包含,所以在SpringBoot项目中导入 spring-boot-starter 后可直接使用:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
</dependencies>

打印日志

  1. 基于LoggerFactory创建日志记录器实例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class LoggingApplication {private static final Logger logger = LoggerFactory.getLogger(LoggingApplication.class);public static void main(String[] args) {logger.info("LoggingApplication start...");SpringApplication.run(LoggingApplication.class, args);logger.info("LoggingApplication end...");}
}

springboot3-logging-factory

  1. 引入lombok依赖,通过注解@Slf4j创建日志记录器实例
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@Slf4j
@SpringBootApplication
public class LoggingApplication {public static void main(String[] args) {log.info("LoggingApplication start...");SpringApplication.run(LoggingApplication.class, args);log.info("LoggingApplication end...");}
}

springboot3-logging-lombok

配置Logback

默认配置

SpringBoot推荐将配置文件名称命名为logback-spring.xml表示这是SpringBoot下Logback专用的配置,可以使用SpringBoot 的高级Profile功能,它的内容类似于这样:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 配置信息 -->
</configuration>

最外层由configuration包裹,一旦编写,那么就会替换默认的配置,所以如果内部什么都不写的话,那么会导致我们的SpringBoot项目没有配置任何日志输出方式,控制台也不会打印日志。

也可在配置文件中指定要使用的日志配置,如application.yml中通过配置 logging.config指定要使用的日志配置。

logging:config: classpath:logback-spring.xml

springboot3-logging-noneconfig

基于SpringBoot默认Logback配置进行定制

SpringBoot 的默认Logback文件可在依赖项中找到。路径为:org/springframework/boot/logging/logback/defaults.xml

springboot3-logging-logback-config-default

在配置文件中对默认配置进行引用,及编写定制配置覆盖默认配置。

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 引用Spring Boot 默认日志配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 控制台日志打印格式 --><property name="CONSOLE_LOG_PATTERN"value="MyLogPattern %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(${LOGGED_APPLICATION_NAME:-}[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><!-- 日志输出到控制台 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${CONSOLE_LOG_THRESHOLD}</level></filter><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>${CONSOLE_LOG_CHARSET}</charset></encoder></appender><!-- 指定日志输出级别 --><root level="INFO"><appender-ref ref="CONSOLE"/></root>
</configuration>

springboot3-logging-config-my

配置日志信息输出到文件

logback-spring.xml 添加如下内容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 引用Spring Boot 默认日志配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 日志文件输出位置 --><property name="LOG_PATH" value="./logs"/><!-- 日志文件名 --><property name="LOG_FILE" value="${LOG_PATH}/spring-boot.log"/><!-- 日志输出到文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${FILE_LOG_THRESHOLD}</level></filter><encoder><pattern>${FILE_LOG_PATTERN}</pattern><charset>${FILE_LOG_CHARSET}</charset></encoder><file>${LOG_FILE}</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern><cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart><maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize><totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap><maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory></rollingPolicy></appender><!-- 指定日志输出级别,以及启动的Appender --><root level="INFO"><appender-ref ref="FILE"/></root>
</configuration>

springboot3-logging-logback-config-tofile

MDC机制

Slf4j官方解释

MDC全称Mapped Diagnostic Context(映射诊断上下文),“映射诊断上下文” 本质上是由日志记录框架维护的映射,其中应用程序代码提供键值对,然后可以由日志记录框架将其插入日志消息中。MDC数据在过滤消息或触发某些操作时也非常有用。

通俗的说就是可以将特定的信息(如请求Id,链路Id),通过MDC机制注入到当前日志线程的上下文中,将信息在日志中记录、输出。

image-20231225104700128

MDC的使用

MDC 常用的三个方法:

  • MDC.put(key,value) 注入值
  • MDC.remove(key) 移除指定的MDC注入信息
  • MDC.clear() 移除所有当前线程的MDC注入信息

MDC注入属性配置:

logback-spring.xml文件的输出格式中添加需要注入的KEY信息与代码注入的信息相对应。假定我需要注入当前用户的Id信息,且设置key为user-id

代码:

import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import java.util.UUID;@Slf4j
@SpringBootApplication
public class LoggingApplication {public static void main(String[] args) {SpringApplication.run(LoggingApplication.class, args);String mdcKey = "user-id";log.info("Logging before MDC put...");MDC.put("mdcKey", UUID.randomUUID().toString());log.info("Logging after MDC put...");MDC.clear();log.info("Logging after MDC clear...");}
}

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 引用Spring Boot 默认日志配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 控制台日志打印格式 --><property name="CONSOLE_LOG_PATTERN"value="[%X{user-id}] %clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(${LOGGED_APPLICATION_NAME:-}[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><!-- 日志输出到控制台 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${CONSOLE_LOG_THRESHOLD}</level></filter><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>${CONSOLE_LOG_CHARSET}</charset></encoder></appender><!-- 指定日志输出级别 --><root level="INFO"><appender-ref ref="CONSOLE"/></root>
</configuration>

springboot3-logging-logback-mdc

使用方式:

  1. 通过注册拦截器或过滤器,在业务开始前获取到相关信息(请求Id,操作人Id),将相关信息通过MDC自动注入到当前线程中,实现关键信息记录。
  2. 在创建子线程时,需要通过MDC.getCopyOfContextMap()方法获取到当前线程的MDC注入相关信息,传递给子线程,才能在子线打印日志信息时获取到父线程MDC的注入信息。

Logback参考配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration><!-- Spring Boot 默认日志配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 日志文件输出位置 --><property name="LOG_PATH" value="./logs"/><!-- 日志文件名 --><property name="LOG_FILE" value="${LOG_PATH}/spring-boot.log"/><!-- 归档日志名 --><property name="FILE_NAME_PATTERN" value="${LOG_FILE}-%d{yyyyMMdd}.%i.gz"/><!-- 在启动时清除历史日志 --><property name="LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START" value="false"/><!-- 单个日志文件最大大小 --><property name="LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE" value="100MB"/><!-- 日志总大小 --><property name="LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP" value="0"/><!-- 日志保留天数 --><property name="LOGBACK_ROLLINGPOLICY_MAX_HISTORY" value="7"/><!-- 控制台日志编码格式 --><property name="CONSOLE_LOG_CHARSET" value="UTF-8"/><!-- 控制台日志打印格式 --><property name="CONSOLE_LOG_PATTERN"value="%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} [%X{user-id}] [%X{request-id}] [%X{client-ip}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(${LOGGED_APPLICATION_NAME:-}[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><!-- 控制台日志输出级别 --><property name="CONSOLE_LOG_THRESHOLD" value="INFO"/><!-- 日志文件输出打印格式 --><property name="FILE_LOG_PATTERN"value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} [%X{user-id}] [%X{request-id}] [%X{client-ip}] ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- ${LOGGED_APPLICATION_NAME:-}[%t] ${LOG_CORRELATION_PATTERN:-}%-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/><!-- 日志文件输出编码格式 --><property name="FILE_LOG_CHARSET" value="UTF-8"/><!-- 日志文件输出级别 --><property name="FILE_LOG_THRESHOLD" value="INFO"/><!-- 日志输出到控制台 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${CONSOLE_LOG_THRESHOLD}</level></filter><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>${CONSOLE_LOG_CHARSET}</charset></encoder></appender><!-- 日志输出到文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${FILE_LOG_THRESHOLD}</level></filter><!-- 日志打印配置 --><encoder><pattern>${FILE_LOG_PATTERN}</pattern><charset>${FILE_LOG_CHARSET}</charset></encoder><!-- 日志文件名 --><file>${LOG_FILE}</file><!-- 日志输出配置 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 日志归档名 --><fileNamePattern>${FILE_NAME_PATTERN}</fileNamePattern><!-- 在启动时清除日志 --><cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START}</cleanHistoryOnStart><!-- 单个文件大小 --><maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE}</maxFileSize><!-- 日志总大小 --><totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP}</totalSizeCap><!-- 日志保留天数 --><maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY}</maxHistory></rollingPolicy></appender><!-- 指定日志输出级别,以及启动的Appender --><root level="INFO"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root>
</configuration>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试 | 信息收集常用方法总结

目录 一、关于域名 1.子域名收集 a.搜索引擎查找 b.在线查询 c.工具 d.SSL/TLS证书查询 2.端口型站点收集 3.目录文件扫描 a.目录扫描工具 b.github搜索 c.google搜索 d.在线网站 e.文件接口工具 4.旁站和C段 a.旁站查询 b.C段查询 5.网站技术架构信息 a.基础…

Django(三)

1.快速上手 确保app已注册 【settings.py】 编写URL和视图函数对应关系 【urls.py】 编写视图函数 【views.py】 启动django项目 命令行启动python manage.py runserverPycharm启动 1.1 再写一个页面 2. templates模板

STM32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件

资料下载: https://download.csdn.net/download/vvoennvv/88658447 一、概述 关于IAP的原理和Ymodem协议&#xff0c;本文不做任何论述&#xff0c;本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级&#xff0c;以及bootloader和主程序两个工程的配置…

CAS-Unsafe类底层汇编源码分析

源码分析&#xff1a; 底层汇编&#xff1a; cmpxchg底层&#xff1a;cmpxchg即比较并交换指令 总结&#xff1a; CAS是靠硬件实现的从而在硬件层面提升效率&#xff0c;最底层还是交给硬件来保证原子性和可见性实现方式是基于硬件平台的汇编指令&#xff0c;在inter的CPU中&a…

Swagger快速入门

1、Swagger快速入门 1.1 swagger介绍 官网&#xff1a;https://swagger.io/ Swagger 是一个规范和完整的Web API框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 功能主要包含以下几点: A. 使得前后端分离开发更加方便&#xff0c;有利于团队协作…

12/25 分析算法时间复杂度的基本方法

分析算法时间复杂度的基本方法&#xff1a; 若f&#xff08;n&#xff09;是m次多项式&#xff0c;则T&#xff08;n&#xff09;O&#xff08;&#xff09; 忽略所有低次幂和最高次幂的系数&#xff0c;体现出增长率的含义&#xff01; 1.找出语句频度最大的那条语句作为基本语…

JVM 类加载子系统

1. 前言 ​ 虚拟机就是一款用来执行虚拟计算机指令的计算机软件。它相当于一台虚拟计算机。大体上&#xff0c;虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机就相当于一台物理电脑&#xff0c;里面可以安装操作系统&#xff1b;程序虚拟机是为了执行单个计算机程序而设计出来…

vue3+ts pinia存储及持久化

index.ts 需要安装pinia-plugin-persist npm i pinia-plugin-persist -Simport { createPinia} from "pinia" // 引入批量的pinia持久存储插件 import piniaPluginPersist from pinia-plugin-persist const storecreatePinia(); store.use(piniaPluginPers…

2024 年网络安全展望:未来是什么?

为了建立强大的网络安全计划&#xff0c;组织必须首先了解整体威胁环境不断变化的性质。 人工智能在成为安全团队的帮助之前&#xff0c;将为网络犯罪分子带来巨大的福音。 网络犯罪分子和不良行为者将受益于先进人工智能工具的广泛部署&#xff0c;然后他们的目标才能建立人…

ts相关笔记(extends、infer、Pick、Omit)

最近刷了本ts小册&#xff0c;对一些知识点做下笔记。 extends extends 是一个关键字&#xff0c;用于对类型参数做一些约束。 A extends B 意味着 A 是 B 的子类型&#xff0c;比如下面是成立的 ‘abc’ extends string599 extends number 看下面例子&#xff1a; type …

蓝牙物联网通信网络设计方案

随着当前经济的快速发展&#xff0c;社会运行节奏加快&#xff0c;人们更倾向于选择高效的出行方式&#xff0c;而飞机就是其中之一。近年来&#xff0c;全国各地机场的吞吐量不断增长&#xff0c;导致航站楼面积过大&#xff0c;而 GPS全球定位系统在室内感测不到卫星信号无法…

音频修复增强软件iZotope RX 10 mac特点介绍

iZotope RX 10 mac是一款音频修复和增强软件。 iZotope RX 10 mac软件特点 声音修复&#xff1a;iZotope RX 10可以去除不良噪音、杂音、吱吱声等&#xff0c;使音频变得更加清晰干净。 音频增强&#xff1a;iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等处…