前言: 這是我第一次仔細研究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>
底層依賴關係
通過這張圖我們能總結出
Spring Boot底層也是使用slf4j+logback的方式進行日誌記錄
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級別呢,依次點選檔案目錄下的這些檔案
從圖中我們能看出,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的預設配置
- 修改預設級別
- 輸出日誌檔案
- 修改列印格式
以下程式碼均在application.properties
檔案中寫入
修改預設級別
logging.level.com.atguigu=trace
這行程式碼指定了Spring Boot會輸出trace及以後級別的日誌記錄,level以後的路徑是當前專案的路徑
輸出日誌檔案
輸出日誌有兩種方法
- logging.file
- 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生效
修改列印格式
我們可以自定義日誌輸入的格式同樣有兩種方法
- logging.pattern.console
- 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-api
,slf4j-log4j12
,log4j
Spring Boot日誌使用到這就到達尾聲了,如果有說的不對的地方還望指出,一起進步。