【Spring Boot】(10)、Spring Boot日誌框架
市面上的日誌框架:
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j...
日誌門面(日誌的抽象層) | 日誌的實現層 |
---|---|
Log4j、Log4j2、JUL(java.util.logging)、Logback |
Spring Boot底層是Spring框架,而Spring框架模式使用的是JCL;
所以Spring Boot對日誌框架進行了封裝,選用
2.1、如何在系統中使用SLF4j
注意點:以後在開發的時候,日誌記錄方法的呼叫,不應該來直接呼叫日誌的實現類,而是呼叫日誌抽象層的方法。
給專案中匯入slf4j.jar和logback.jar。
使用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作為配置檔案。
在一個大型的系統專案中,會運用到多種框架,比如Spring,Hibernate,Mybatis...,而每個框架的日誌框架又不盡相同,既然如此,如何統一日誌記錄?下圖來源於slf4j官網的圖片,上面很好的解釋瞭如何將其他日誌框架統一到slf4j!!!
1、將系統中其他日誌框架先排除出去;
2、用中間包替換原有的日誌框架;
每一個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.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.path | Example | Description | |
---|---|---|---|
(none) | (none) | 只在控制檯輸出 | |
指定檔名 | (none) | my.log | 輸出日誌到my.log檔案中 |
(none) | 指定目錄 | /var/log | 輸出日誌到指定目錄下的spring.log檔案中 |
日誌輸出格式:
%d表示日期時間,
%thread表示執行緒名,
%-5level:級別從左顯示5個字元寬度
%logger{50} 表示logger名字最長50個字元,否則按照句點分割。
%msg:日誌訊息,
%n是換行符
在類路徑下放置當前系統中使用的日誌框架的自定義配置檔案即可,Spring Boot就不再使用預設的配置了。
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,則會直接被日誌框架所識別;
如果日誌配置檔名為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>
可以按照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-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>
====================打個廣告,歡迎關注====================