1. 程式人生 > >【Spring Boot】(10)、Spring Boot日誌框架

【Spring Boot】(10)、Spring Boot日誌框架

1、日誌框架

市面上的日誌框架:

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j...

日誌門面(日誌的抽象層)日誌的實現層
JCL(Jakarta Common logging)---Apache常用的common-loggingSLF4j(Simple Logging Facade for Java)、jboss-loggingLog4jLog4j2JUL(java.util.logging)、Logback

Spring Boot底層是Spring框架,而Spring框架模式使用的是JCL

所以Spring Boot對日誌框架進行了封裝,選用 

SLF4j 和 Logback作為日誌框架。

2、SLF4j使用

2.1、如何在系統中使用SLF4j

注意點:以後在開發的時候,日誌記錄方法的呼叫,不應該來直接呼叫日誌的實現類,而是呼叫日誌抽象層的方法。

  1. 給專案中匯入slf4j.jar和logback.jar。

  2. 使用slf4j進行日誌記錄。

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包


每一個日誌的實現框架都有自己的配置檔案。所以即使使用了slf4j以後,配置檔案還是日誌實現框架的配置檔案。例如:sfl4j作為抽象層,log4j作為實現層,則需要使用log4j.properties或log4j.xml作為配置檔案。

2.2、遺留問題

在一個大型的系統專案中,會運用到多種框架,比如Spring,Hibernate,Mybatis...,而每個框架的日誌框架又不盡相同,既然如此,如何統一日誌記錄?下圖來源於slf4j官網的圖片,上面很好的解釋瞭如何將其他日誌框架統一到slf4j!!!

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

  • 1、將系統中其他日誌框架先排除出去;

  • 2、用中間包替換原有的日誌框架;

  • 3、我們匯入slf4j其他的實現。

3、Spring Boot的日誌框架

每一個Spring Boot應用都依賴於spring-boot-starter:

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

spring-boot-starter又依賴於spring-boot-starter-logging:

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

所以Spring Boot的底層依賴關係:


總結: 1)、Spring Boot底層使用的是slf4j+logback的方式進行日誌記錄; 2)、Spring Boot也把其他的日誌替換成了slf4j,並把Spring底層的commons-logging移除掉了:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3)、同時Spring Boot匯入中間替換包,替換包的包名其實跟原來的包名一樣,做了進一步的封裝,並在內部使用slf4j:

public abstract class LogFactory {
    //內部使用的是SLF4JLogFactory
    static LogFactory logFactory = new SLF4JLogFactory();
}

4)、如果要引入其他的框架?一定要把這個框架的預設日誌依賴移除掉!,Spring Boot能夠自動適配所有的日誌框架,而且底層使用slf4j+logback的方式進行日誌的記錄,所以再引入其他框架的時候,只需要把這個框架所依賴的日誌框架排除掉。

4、日誌使用

4.1、預設配置

Spring Boot預設已經配置好了日誌,可以直接使用SLF4J裡的LoggerFactory:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot03LoggingApplicationTests {

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

	@Test
	public void contextLoads() {
		//日誌的級別:
		//由低到高:trace < debug < info < warn < error
		//可以調整輸出的日誌級別,日誌就只會輸出大於或等於當前設定的日誌級別的所有日誌資訊
		logger.trace("這是trace日誌");
		logger.debug("這是debug日誌");

		//Spring Boot預設的日誌級別是info
		logger.info("這是info日誌");
		logger.warn("這是warn日誌");
		logger.error("這是error日誌");
	}
}

通過在配置檔案中設定日誌級別:

# 設定預設的root級別,即Spring Boot預設的日誌級別
logging.level.root=debug

# 設定org.com.cay.spring.boot所在的包使用trace的日誌級別,其他使用預設的
logging.level.org.com.cay.spring.boot=trace
其他配置項:
# 在當前專案下生成springboot.log日誌檔案,也可以使用絕對路徑
logging.file=springboot.log

# 在當前磁碟的根路徑下建立spring資料夾以及裡面的log資料夾,並使用預設的spring.log作為日誌檔名
logging.path=/spring/log/
logging.filelogging.pathExampleDescription
(none)(none)只在控制檯輸出
指定檔名(none)my.log輸出日誌到my.log檔案中
(none)指定目錄/var/log輸出日誌到指定目錄下的spring.log檔案中

日誌輸出格式:

    %d表示日期時間,

    %thread表示執行緒名,

    %-5level:級別從左顯示5個字元寬度

    %logger{50} 表示logger名字最長50個字元,否則按照句點分割。

    %msg:日誌訊息,

    %n是換行符

4.2、自定義日誌配置檔案

在類路徑下放置當前系統中使用的日誌框架的自定義配置檔案即可,Spring Boot就不再使用預設的配置了。

Logging SystemCustomization
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy
Log4j2log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging)logging.properties

Spring Boot提供給日誌框架高階Profile特性:

  • 如果日誌配置檔名為logback.xml,則會直接被日誌框架所識別;

  • 如果日誌配置檔名為logback-spring.xml(推薦加上-spring),則日誌框架不會直接載入日誌的配置,而是由Spring Boot來解析日誌配置,從而可以使用Spring Boot提供的高階Profile功能;

springProfile標籤可以根據當前環境的profile來動態切換日誌的配置項,而springProfile可以在logback的配置檔案的configuration根標籤下任何地方使用,多個profile使用逗號分隔開。

<configuration>
	<springProfile name="dev">
    	<!-- 當前是dev環境時使用如下配置 -->
    </springProfile>
    <springProfile name="!dev">
    	<!-- 當前不是dev環境時使用如下配置 -->
    </springProfile>
    <springProfile name="staging, prod">
    	<!-- 當前環境是staging或者prod時使用如下配置 -->
    </springProfile>
</configuration>

注意:如果使用logback.xml作為配置檔名,而在裡面使用了springProfile標籤,則會報錯。

5、切換日誌框架

可以按照slf4j的日誌適配圖,進行相關的切換。

舉例:slf4j+logback切換成slf4j+log4j

  • 先移除掉logback的依賴

  • 然後移除log4j-over-slf4j的依賴

  • 新增slf4j-log412的依賴

  • 最後新增log4j.properties到resources目錄下

<dependency>
    <groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
        	<groupId>ch.qos.logback</groupId>
       		<artifactId>logback-classic</artifactId>
   		</exclusion>
    	<exclusion>
            <groupId>org.slf4j</groupId>
      		<artifactId>log4j-over-slf4j</artifactId>
    	</exclusion>
  	</exclusions>
</dependency>

<dependency>
  	<groupId>org.slf4j</groupId>
  	<artifactId>slf4j-log4j12</artifactId>
</dependency>

spring-boot-starter-logging切換成spring-boot-starter-log4j2

  • 移除spring-boot-starter-logging的依賴

  • 新增spring-boot-starter-log4j2的依賴

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

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

====================打個廣告,歡迎關注====================