天天看點

Spring Boot學習之---Spring Boot的日志架構(五)

一、日志架構的了解

  • 市面上的日志架構。分為日志門面和日志實作。
  • Spring架構預設使用的JCL(也就是commons-logging)
  • Spring Boot選用SLF4j和logback。
  • JCL 最後更新在2014年,之後就沒有更新了。是以現在主要使用SLF4J來列印日志
  • log4j、logback、slf4j都是一個人寫的。log4j存在缺陷是以有了logback。後來發現該有一個接口規範來定義,是以有了日志門面slf4j
  • log4j2是Apache公司仿的log4j
日志門面 (日志的抽象層) 日志實作

JCL(Jakarta Commons Logging 2014年後不再更新)

SLF4j(Simple Logging Facade for Java)

jboss-logging

Log4j

JUL(java.util.logging)

Log4j2

Logback

二、 SLF4j的使用 官網:https://www.slf4j.org

1、如何在系統中使用SLF4j 

開發的時候日志記錄方法的調用,不應該直接調用日志的實作類,而是調用日志門面的方法。

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

每一個日志的實作架構都有自己的配置檔案,使用slf4j後,配置檔案還是 日志實作jar 本身的配置檔案(日志門面隻是一個接口,具體日志配置檔案還是日志實作的配置檔案)。

圖示(在官網中找到這張圖):隻要日志門面,沒有日志實作輸出為null; Spring Boot選用SLF4j日志門面和logback日志實作。

Spring Boot學習之---Spring Boot的日志架構(五)

 2、遺留問題

以前的系統并不是使用的SLF4j和logback日志架構,如Spring(commons-logging)、Hibernate(jboss-logging) 等架構如何統一使用slf4j進行日志輸出呢?解決辦法如:圖示(在官網中找到這張圖)

Spring Boot學習之---Spring Boot的日志架構(五)
  • 如何讓系統中所有的日志都統一到slf4j?
  • 1、将系統中其他日志架構先排除出去;--先踢掉舊jar
  • 2、用中間包(圖中的架構轉換包)來替換原先的日志架構;--偷梁換柱包
  • 3、導入slf4j及其實作 。

3、 Spring Boot的日志關系

以圖示方式顯示Spring Boot的底層依賴關系 :右鍵--》Diagrams--》show dependencies

可以看到spring-boot-starter是一個基本依賴,spring-boot-starter--》spring-boot-starter-logging(SpringBoot使用它來做日志功能 )

Spring Boot學習之---Spring Boot的日志架構(五)
Spring Boot學習之---Spring Boot的日志架構(五)
  • 總結:
  • 1、SpringBoot底層使用slf4j+logback的方式來進行日志記錄
  • 2、 SpringBoot把其他日志都替換成了slf4j,使用中間替換包
    Spring Boot學習之---Spring Boot的日志架構(五)
  • 3、如何引入其他日志架構呢?一定要把架構預設的日志依賴移除。比如Spring架構使用的是commons-logging,Spring Boot是怎麼做的呢?在底層依賴關系上找到spring-boot-starter-logging,輕按兩下,可以看到移除了commons-logging依賴。
    Spring Boot學習之---Spring Boot的日志架構(五)
  • 4、Spring Boot能自動适配所有的日志,底層使用slf4j+logback的方式來進行日志記錄。如果要引入其他日志架構,隻需要把預設依賴的日志架構排除,再引入新的日志依賴即可。

4、 Spring Boot的日志使用

1)、預設配置

Spring Boot預設幫我們配置好了日志:

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

    @Test
    void contextLoads() {
        //日志的級别;
        //由低到高   trace<debug<info<warn<error
        //可以調整輸出的日志級别;日志就隻會在這個級别以後的進階别生效
        logger.trace("這是trace日志...");
        logger.debug("這是debug日志...");
        //SpringBoot預設給我們使用的是info級别的,沒有指定級别的就用SpringBoot預設規定的級别;root級别
        logger.info("這是info日志...");
        logger.warn("這是warn日志...");
        logger.error("這是error日志...");

    }
           

預設的日志格式:${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}

日志輸出格式:
		%d表示日期時間,
		%thread表示線程名,線程id
		%-5level:級别從左顯示5個字元寬度,-5是靠左對齊
		%logger{50} 表示logger名字最長50個字元,否則按照句點分割。 
		%msg:日志消息,
		%n是換行符

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
           
Spring Boot學習之---Spring Boot的日志架構(五)

 在哪裡看配置:logback下面的defaults.xml、file.appender.xml等檔案。意思是:超過10M之後,自動生成log2、log3等檔案

Spring Boot學習之---Spring Boot的日志架構(五)
Spring Boot學習之---Spring Boot的日志架構(五)

2)、如何修改SpringBoot的日志預設配置  

Spring Boot學習之---Spring Boot的日志架構(五)
logging.file.name logging.file.path Example Description
(none) (none) 隻在控制台輸出(預設)
指定檔案名 (none) my.log 輸出日志到my.log檔案
(none) 指定目錄 /var/log 輸出到指定目錄的 spring.log 檔案中

3)、指定配置檔案

如果我們想自己寫日志的配置檔案,可以命名為

logback-spring.xml

logback.xml,推薦命名為

logback-spring.xml

Logging System Customization(直接用以下檔案命名,架構自動加載.優先級比application.properties高)
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 :直接被日志架構識别(而不是Spring Boot架構,不識别不處理)。

        ---如果使用logback.xml作為日志配置檔案,還要使用profile功能,會有以下錯誤:no applicable action for [springProfile]

  • logback-spring.xml:由SpringBoot解析日志配置,可以使用Spring Boot的進階Profile功能。
    <springProfile name="staging">
        <!-- configuration to be enabled when the "staging" profile is active -->
      	可以指定某段配置隻在某個環境下生效
    </springProfile>
    
    如:在dev環境下和非dev環境下的不同輸出
    <springProfile name="dev">
    	<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
    </springProfile>
    <springProfile name="!dev">
    	<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
    </springProfile>
               

    5、切換日志架構

可以按照slf4j的日志适配圖,進行日志架構的切換。

(1)轉成slf4j+log4j的形式(并不推薦,logback是log4j的更新):①先移除

Spring Boot學習之---Spring Boot的日志架構(五)

②可以看到如圖被移除了;

Spring Boot學習之---Spring Boot的日志架構(五)

③再添加slf4j-log4j12的依賴即可。

Spring Boot學習之---Spring Boot的日志架構(五)
Spring Boot學習之---Spring Boot的日志架構(五)

(2)Spring Boot也支援slf4j+log4j2的starter。切換也很簡單,①排除依賴spring-boot-starter-logging;②添加依賴spring-boot-starter-log4j2

Spring Boot學習之---Spring Boot的日志架構(五)
Spring Boot學習之---Spring Boot的日志架構(五)
Spring Boot學習之---Spring Boot的日志架構(五)
Spring Boot學習之---Spring Boot的日志架構(五)

繼續閱讀