Spring Boot日誌使用

Wang發表於2019-07-17

前言: 這是我第一次仔細研究Spring Boot相關的知識,就拿日誌下手了,歡迎大家指點

Spring Boot日誌關係

這個是Spring Boot的啟動器,我們點選spring-boot-starter

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

這個spring-boot-starter-logging就是Spring Boot用來做日誌功能的

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

底層依賴關係

通過這張圖我們能總結出

  1. Spring Boot底層也是使用slf4j+logback的方式進行日誌記錄

  2. Spring Boot也把其他的日誌都替換成了slf4j;

那麼Spring Boot是如何將這些日誌都替換成slf4j的呢?我們找到其中的一個jcl-over-slf4j

我們可以看到裡面有個commons.logging,裡面實現的正是SLF4JLogFactory

@SuppressWarnings("rawtypes")
public abstract class LogFactory {

    static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";

    static LogFactory logFactory = new SLF4JLogFactory();

那麼我們如果要引入其它框架,一定要把這個框架的預設日誌依賴移除掉。

Spring Boot用的是commons-logging

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

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

日誌使用

預設配置

Spring Boot預設幫我們配置好了日誌;日誌有五種級別,由低到高是trace<debug<info<warn<error,可以調整輸出的日誌級別;日誌就只會在這個級別及以後的高階別生效,Spring Boot預設給我們使用的是info級別的,沒有指定級別的就用SpringBoot預設規定的級別;root級別

為什麼也叫root級別呢,依次點選檔案目錄下的這些檔案

graph LR A[External Libraries]-->B[springframework.boot.spring-boot] B-->C[org] C-->D[springframework] D-->E[boot] E-->F[logging] F-->G[logback] G-->H[base.xml]

從圖中我們能看出,Spring Boot有個預設標籤<root>裡面指定的級別正是INFO,這也就是為什麼預設級別叫root級別,作為一個小知識點給大家擴充套件了一下,下面進入正題,我們在測試類中寫下以下程式碼。

//記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
	logger.trace("這是trace日誌...");
	logger.debug("這是debug日誌...");
	//SpringBoot預設給我們使用的是info級別的,沒有指定級別的就用SpringBoot預設規定的級別;root級別
	logger.info("這是info日誌...");
	logger.warn("這是warn日誌...");
	logger.error("這是error日誌...");
	}

現在我們啟動這個測試類

可以看出只列印出了info及以後的日誌記錄,也印證了前面所說的

修改預設配置

接下來我們來修改Spring Boot的預設配置

  1. 修改預設級別
  2. 輸出日誌檔案
  3. 修改列印格式

以下程式碼均在application.properties檔案中寫入

修改預設級別

logging.level.com.atguigu=trace

這行程式碼指定了Spring Boot會輸出trace及以後級別的日誌記錄,level以後的路徑是當前專案的路徑

輸出日誌檔案

輸出日誌有兩種方法

  1. logging.file
  2. logging.path
logging.file

輸出指定檔名的日誌,通過這個我們可以指定輸出的日誌檔名的名稱

logging.file=f:/springlog/springboot.log

我們會在這個路徑下生成一個叫springboot.log的日誌,如果沒有指定路徑,會在當前專案下生成springboot.log日誌

logging.path

在f盤下建立springlogpath資料夾和裡面的log檔案;使用 spring.log 作為預設檔案

logging.path=f:/springlogpath
logging.file logging.path Example Description
(none) (none) 只在控制檯輸出
指定檔名 (none) my.log 輸出日誌到my.log檔案
(none) 指定目錄 /var/log 輸出到指定目錄的 spring.log 檔案中

如果都不指定,預設只在控制檯輸出,如果同時指定,只有logging.file生效

修改列印格式

我們可以自定義日誌輸入的格式同樣有兩種方法

  1. logging.pattern.console
  2. logging.pattern.file
logging.pattern.console

修改控制檯輸出日誌格式

logging.pattern.console=%d{yyyy-MM-dd} ----> [%thread] ----> %-5level---> %logger{50} ---> %msg%n

我們用---->的方式來作為控制檯列印日誌的連線

如我們所預期的一樣,每個log中都是用的---->來連線的

logging.pattern.file

修改指定檔案中輸出日誌的格式

logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n

日誌檔案裡我們用===來作為連線看效果

    日誌輸出格式:
		%d表示日期時間,
		%thread表示執行緒名,
		%-5level:級別從左顯示5個字元寬度
		%logger{50} 表示logger名字最長50個字元,否則按照句點分割。 
		%msg:日誌訊息,
		%n是換行符
    -->
    %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

這個就是日誌輸出的格式,大家可以照著這個來自定義自己的日誌

指定配置

我們可以給類路徑下放上每個日誌框架自己的配置檔案;SpringBoot就不使用他預設配置的了

Logging 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,他能直接就被日誌框架識別,

而Spring Boot官網建議我們用的是logback-spring.xml來擴充套件高階功能

如果我們放的是logback-spring.xml日誌框架就不能識別配置檔案從而直接載入日誌的配置項,由Spring Boot解析日誌配置,我們可以使用Spring Boot的高階Profile功能

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

在配置檔案中加上這個標籤就可以某段配置只在指定環境下生效,比如這段程式碼就會在dev環境下才生效

切換日誌框架

我們可以在Spring Boot官網找到這張圖片

如果我們想使用log4j,那麼我們需要匯入log4j一系列的所有包。slf4j-apislf4j-log4j12log4j

Spring Boot日誌使用到這就到達尾聲了,如果有說的不對的地方還望指出,一起進步。

相關文章