浅谈SpringBoot底层日志文件依赖关系及日志使用

Posted 一宿君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈SpringBoot底层日志文件依赖关系及日志使用相关的知识,希望对你有一定的参考价值。

1、常见的日志框架

  • JCL(Comons logging,Spring框架默认-抽象层)
  • Jboss-logging(Hibernate框架默认-抽象层)
  • slf4j(主流java日志抽象层)
  • JUL(JVM Runtime,java中util包内置日志框架)
  • log4j(Mybatis框架默认)
  • log4j2(log4j的修订版)
  • logback(轻量日志实现)

2、日志抽象和日志实现

日志抽象(相当于日志的抽象层)日志实现
JCL(Jakarta Commons Logging)Jboos-loggingslf4j(Simple Logging Facade For Java)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的转换实现。

总结:

  1. SpringBoot底层就是使用slf4j+logback的方式进行日志记录的;
  2. SpringBoot也把其他框架的日志文件替换成了slf4j的相关依赖;
  3. 替换使用的是slf4j官方提供的中间替换包:
    如下图:
  4. 如果我们要引入其他框架,一定要把这个框架的默认日志依赖排除掉。

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底层日志文件依赖关系及日志使用的主要内容,如果未能解决你的问题,请参考以下文章

springboot:日志(日志框架关系级别)

idea2021.1版本SpringBoot项目日志的说明及使用

idea2021.1版本SpringBoot项目日志的说明及使用

SpringBoot使用AOP记录请求日志和异常日志

浅谈MYSQL之日志文件系统

SpringBoot统一日志框架