前言: 這是我第一次仔細研究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日志使用到這就到達尾聲了,如果有說的不對的地方還望指出,一起進步。