SpringBoot日誌功能

三、SpringBoot日誌功能

1、日誌框架

市面上的日誌框架:

JUL、JCL、Jboss-logging、Logback、Log4j、Log4j、SLF4J…

日誌門面(日誌的抽象層) 日誌實現
JCL(Jakarta Commons Logging)SLF4J(Simple Logging Facader for Java)Jboss-logging Log4j JUL (java.uti.logging) Log4j2 Logback

左邊選擇一個門面(抽象層),右邊選擇一個實現:

日誌門面:SLF4J;

日誌實現:Logback。

SpringBoot : 底層是Spring框架,Spring框架默認是用JCL ; SpringBoot選用SLF4J和logback

2、SLF4J使用

2.1、如何在系統中使用SLF4J://www.slf4j.org/

開發的時候,日誌記錄方法的調用,不應該·來直接調用日誌的實現類,而是調用日誌抽象層裏面的方法;

需要給系統裏面導入SLF4J的jar和logback的實現jar

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");
  }
}

圖示:

concrete-bindings

每一個日誌的實現框架都有自己的配置文件。使用SLF4J以後,配置文件還是做成日誌實現框架自己本身的配置文件。

2.2遺留問題

a ( SLF4J + logback ) : Spring ( commons-logging ) 、Hibernate ( jboss-logging ) 、Mybatis、xxx

統一日誌記錄,即使是別的框架,也能統一使用SLF4J進行輸出?

legacy

如何讓系統中所有的日誌都統一到SLF4J :

  1. 將系統中其他日誌框架先排除出去;
  2. 用中間包來替換原有的日誌框架;
  3. 導入SLF4J其他的實現。

3、SpringBoot日誌關係

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.3.1.RELEASE</version>
    <scope>compile</scope>
</dependency>

SpringBoot用它來做日誌功能:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <version>2.3.1.RELEASE</version>
    <scope>compile</scope>
</dependency>

底層依賴關係:

image-20200710170008590

總結:

  1. SpringBoot底層是使用SLF4J + logback的方式進行日誌記錄;

  2. SpringBoot把其他的日誌都替換成了SLF4J;

  3. 中間替換包:

    image-20200710171311009

  4. 如果我們要引入其他框架,一定要把這個框架的默認日誌依賴移除掉。( Spring5默認的抽象層由comons-logging變成SLF4J )。

SpringBoot能自動適配所有的日誌,而且底層使用SLF4J + logback的方式記錄日誌,引入其他框架的時候,只需要把這個框架依賴的日誌框架排除掉。

4、日誌使用

4.1、默認配置

SpringBoot默認幫我們配好了日誌:

    //記錄器
    Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    void contextLoads() {
        //日誌的級別由低到高:trace<debug<info<warn<error
        //可以調整輸出的日誌級別,日誌就只會在這個級別以後的高級別生效
        logger.trace("trace日誌");
        logger.debug("debug日誌");
        //SpringBoot默認使用的是info級別的,也成為root級別
        logger.info("info日誌");
        logger.warn("warn日誌");
        logger.error("error日誌");
    }

SpringBoot修改日誌的默認配置:

#指定日誌的輸出級別
logging.level.com.hello=trace

#不指定路徑就在當前項目下生成springboot.log日誌
#可以指定完整的路徑
#logging.file.name=E:/springboot.log
#在當前磁盤的根路徑下創建springHello文件夾和裏面的log文件夾,使用spring.log作為默認文件
logging.file.path=/springHello/log

#在控制太輸出的日誌的格式
logging.pattern.console=
#指定文件中日誌輸出的格式
logging.pattern.file=

4.2、指定配置

給類路徑放上每個日誌框架自己的配置文件即可,SpringBoot就不使用默認配置

ogging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

logback.xml : 直接就被日誌框架識別了;

logback-spring.xml : 日誌框架就不直接加載日誌的配置項,由SpringBoot解析日誌配置,可以使用SpringBoot的高級Profile功能

<springProfile name="staging">
    //可以指定某段配置只在某個環境下生效
    <!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>

<springProfile name="dev | staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>