浅谈SpringBoot底层日志文件依赖关系及日志使用
Posted 一宿君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈SpringBoot底层日志文件依赖关系及日志使用相关的知识,希望对你有一定的参考价值。
浅谈SpringBoot底层日志文件依赖关系及日志使用
1、常见的日志框架
- JCL(Comons logging,Spring框架默认-抽象层)
- Jboss-logging(Hibernate框架默认-抽象层)
- slf4j(主流java日志抽象层)
- JUL(JVM Runtime,java中util包内置日志框架)
- log4j(Mybatis框架默认)
- log4j2(log4j的修订版)
- logback(轻量日志实现)
2、日志抽象和日志实现
日志抽象(相当于日志的抽象层) | 日志实现 |
---|---|
JUL(java.util.logging)、Log4j、Log4j2、Logback |
- JCL(Jakarta Commons Logging)
jcl是apache公司jakarta小组开发的日志框架,不再更新(止步2014),版本较老。
- Jboss-logging
功能过于高大上,不适合普通程序员使用(平时开发很少用到)。
- slf4j(Simple Logging Facade For Java)
是专门为java打造的一个日志框架(日志抽象层)。
- JUL(java.util.logging)
是java中util包内置的一个日志,是基于log4j的竞争而产生(用着也不赖)。
- Log4j
log4j很强,但是存在一定的性能问题,为了与slf4j整合实现,要大改整个实现功能,但是这样的话还不如重新再写一个
- Log4j2
后者对其加强修改,升级了log4j,功能太过强大,与现有的日志抽象层框架不易整合。
- Logback
正由于log4j存在性能问题,开发者再次开发一个轻量日志实现-logback
上述slf4j和log4j和Logback均是由同一个人编写,所以我们在选择日志抽象层和日志实现时,自然便选择了:
日志门面(抽象层):slf4j
日志实现:Logback
SpringBoot:底层是Spring框架,Spring框架默认是用JCL;
而SpringBoot是选用 SLF4框架j,由logback来实现
3、如何在系统中使用slf4j?(slf4j官方用户指导手册)
在我们的以后开发过程中,想调用日志记录方法,不应该直接调用实现类(logback)中的方法,而是应该调用日志抽象层(slf4j)的方法。
首先导入slf4j和logback的jar包依赖;
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.5</version>
</dependency>
按照编程传统的习惯,这里有一个示例说明使用SLF4J输出“Hello world”的最简单方法。它首先获取一个名为“HelloWorld”的日志记录器。该日志记录器依次用于记录消息“Hello World”。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
4、slf4j与常用日志实现类的整合框架图
每一个日志的实现框架都有自己的配置文件,使用slf4j抽象层框架后,配置文件依然是做成实现日志框架本身的配置文件,slf4j只是提供了一个抽象层及方法供各种日志实现类集成。
5、Bridging legacy APIs(桥接遗留apis)
为什么使用桥接遗留apis?
这是使用slf4j框架的存在的一些问题,也就是说我们在做项目开发的过程中,不可能是单一的使用某一个框架,而是好几个框架相互整合成为一个框架用于系统开发,例如:SpringBoot底层是依赖spring框架,而又继承了Hibernate和Mybatis等框架,才使得SpringBoot框架在开发方面很是高效。
我们知道SpringBoot框架默认是使用slf4j+logback组合日志框架记录日志,而其中的继承框架各自的默认日志框架如下:
- Spring框架默认使用JCL(Commons logging)
- Hibernate框架默认使用Jboss-logging
- Mybatis框架默认使用log4j
这个时候我们想要该系统框架统一使用集成框架SpringBoot的默认日志框架(slf4j+logback),就是要使用slf4j官方为我们提供的中间包(桥接apis)替换掉Spring、Hibernate和Mybatis自身默认的日志框架(也称为排除),桥接apis流程框架图如下:
如何让系统中所有的日志都统一到slf4j(分为三步)
1、将系统中其他日志框架先排除出去;
2、用中间包来替换原有的日志框架;
3、导入slf4j其他的日志实现(也就是集成框架要统一使用的日志实现)。
6、SpringBoot的日志关系
新建一个SpringBoot项目,项目初始化时选择Web依赖:
<!--web场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--测试场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
在pom.xml文件页面,鼠标右键选择Diagrams(图解、示意图)选项
展开项目所有依赖关系图解:
简单介绍下SpringBoot底层依赖Spring框架:
SpringBoot最基本的启动器依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.3</version>
<scope>compile</scope>
</dependency>
SpringBoot底层日志依赖关系:
SpringBoot日志场景依赖启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.5.3</version>
<scope>compile</scope>
</dependency>
分析SpringBoot默认日志slf4j+logback及排除底层框架默认指定日志文件之间的依赖关系(使用桥接APIS):
上述日志依赖关系图解,实际上就是我们在前文在slf4j官方指导手册中的那张桥接apis的转换实现。
总结:
- SpringBoot底层就是使用slf4j+logback的方式进行日志记录的;
- SpringBoot也把其他框架的日志文件替换成了slf4j的相关依赖;
- 替换使用的是slf4j官方提供的中间替换包:
如下图: - 如果我们要引入其他框架,一定要把这个框架的默认日志依赖排除掉。
7、日志使用
日志默认配置
- SpringBoot已经默认帮我们配置好了日志;
- 日志级别(由低到高):
trace < debug < info < warn < error
- 可以指定日志的级别,日志就会在本级别及以上更高级别的所有日志均生效;
- 如果不指定,则默认从info级别开始(root权限);
简单日志使用
package com.boot.main;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringBoot01LoggingApplicationTests {
//日志记录器
Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
void contextLoads() {
//日志的级别(由低到高)
//trace < debug < info < warn < error
//可以指定日志的级别,日志就会在本级别及以上更高级别的所有日志均生效
// (如果不指定,则默认从info级别开始(root权限))
logger.trace("这是trace追踪日志记录");
logger.debug("这是debug调试日志记录");
logger.info("这是info运行日志记录");
logger.warn("这是warn警告日志记录");
logger.error("这是error错误日志记录");
}
}
运行查看控制台日志输出:
如果在properties或yml配置文件中指定日志级别,则系统将从指定日志级别开始记录:
#将项目的com.boot包(主入口类所在包)及其所有子包的日志级别改为trace追踪级别(最低层开始)
logging.level.com.boot = trace
再次运行,查看控制台日志输出:
指定日志文件
将日志记录存储到指定的日志文件中:
#生成日志名称,不指定路径,默认在当前项目目录下
logging.file.name=springboot.log
#指定路径,就生成在指定路径下
logging.file.name=D:/springboot.log
#在当前磁盘路径下生成spring和log两个嵌套目录(并默认以spring.log为日志文件名)
logging.file.path=/spring/log
运行查看结果(指定路径同理):
日志profile功能
#日志输出格式:
%d表示日期时间,
%thread表示线程名,
%5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
根据上述规则自定义日志输出格式:
#指定控制台中的日志输出格式
logging.pattern.console=%d{yyyy‐MM‐dd HH:mm:ss:SSS} - [%thread] %5level %logger{50} - %msg%n
##指定文件中的日志记录格式
logging.pattern.file=%d{yyyy‐MM‐dd HH:mm:ss:SSS} === [%thread] %5level %logger{50} === %msg%n
运行查看控制台:
以上就是关于slf4j日志框架的一些简单操作和相关配置,欢迎指正,今先到这!!!再会!!!
以上是关于浅谈SpringBoot底层日志文件依赖关系及日志使用的主要内容,如果未能解决你的问题,请参考以下文章
idea2021.1版本SpringBoot项目日志的说明及使用