SpringBoot學習_日誌
文章目錄
日誌框架分類和選擇
日誌門面與日誌實現的關係有點像、JDBC和資料庫驅動的關係
日誌門面 (日誌的抽象層) | 日誌實現 |
---|---|
JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
SpringBoot選用 SLF4j
和logback
SpringBoot使用它來做日誌功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.0.5.RELEASE</version >
<scope>compile</scope>
</dependency>
SLF4j使用
開發的時候日誌記錄方法的呼叫,不應該來直接呼叫日誌的實現類,而是呼叫日誌抽象層裡面的方法
SLF4J使用者手冊
首先給系統裡面匯入slf4j的jar和 logback的實現jar
Hello World:
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以後,配置檔案還是做成日誌實現框架自己本身的配置檔案
統一日誌記錄
在實際開發中情況會更復雜一些
例子:
在開發a系統的時候用的是(slf4j+logback),系統中需要用到Spring(commons-logging),hibernate((jboss-logging),mybatis等等,這些框架底層中又自帶了日誌記錄,現在想統一使用slf4j日誌
圖示
如何讓系統中所有的日誌都統一到slf4j:
- 將系統中其他日誌框架先排除出去
- 用中間包來替換原有的日誌框架
- 我們匯入slf4j其他的實現
這些SpringBoot都已經幫我們最好了
在pom.xml
中右鍵
會跳轉到一個流程圖,從中我們可以看到
總結:
- SpringBoot底層也是使用slf4j+logback的方式進行日誌記錄
- SpringBoot也把其他的日誌都替換成了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>
SpringBoot能自動適配所有的日誌,而且底層使用slf4j+logback的方式記錄日誌,引入其他框架的時候,只需要把這個框架依賴的日誌框架排除掉即可
我所使用的的springboot
版本是2.0.5.RELEASE
,裡面的spring
版本是5.0.9.RELEASE
,沒有commons‐logging
,所以不用排除
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.9.RELEASE</version>
<scope>compile</scope>
</dependency>
日誌使用
預設配置
SpringBoot預設幫我們配置好了日誌
我們可以在測試類中看一下
//記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//System.out.println();
//日誌的級別;
//由低到高 trace<debug<info<warn<error
//可以調整輸出的日誌級別;日誌就只會在這個級別以後的高級別生效
logger.trace("這是trace日誌...");//框架執行中如果你想跟蹤資訊時用
logger.debug("這是debug日誌...");//除錯資訊
//SpringBoot預設給我們使用的是info級別的,沒有指定級別的就用SpringBoot預設規定的級別;root級別
logger.info("這是info日誌...");//自己定義的想要輸出的資訊
logger.warn("這是warn日誌...");//警告
logger.error("這是error日誌...");//錯誤
}
修改日誌的級別:
#表示把com.nyh裡面的所有的類的日誌都調為`trace`級別
logging.level.com.nyh=trace
執行結果:
日誌的格式
日誌輸出格式:
%d
表示日期時間,
%thread
表示執行緒名,
%‐5level
:級別從左顯示5個字元寬度
%logger{50}
表示logger名字最長50個字元,否則按照句點分割。
%msg
:日誌訊息,
%n
是換行符
輸出:
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
在properties或yml配置檔案中配置
# 在控制檯輸出的日誌的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定檔案中日誌輸出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制檯輸出 | |
指定檔名 | (none) | my.log | 輸出日誌到my.log檔案 |
(none) | 指定目錄 | /var/log | 輸出到指定目錄的 spring.log 檔案中 |
這種方法只能修改一些預設配置,想要知道更多的預設配置可以到Maven: org.springframework.boot:spring-boot:2.0.5.RELEASE2
jar包下的logging
下檢視配置檔案
例如logback的日誌配置檔案:
自定義日誌配置
如果我們想要用springboot的日誌高階功能,比如非同步日誌,自動歸檔等,我們需要自己寫配置檔案
在官方文件中有專門的介紹
給類路徑(resources資料夾)下放上每個日誌框架自己的配置檔案即可;SpringBoot就不使用他預設配置的了
名字有兩種:
logback.xml
:會直接就被日誌框架識別,相當於繞過了springboot;
logback-spring.xml
:日誌框架就不直接載入日誌的配置項,由SpringBoot解析日誌配置,可以使用SpringBoot的高階Profile功能
logback-spring.xml
這種寫法的好處是可以使用springProfile標籤
<springProfile name="dev">
<!‐‐ configuration to be enabled when the "staging" profile is active
指定這段配置只在dev環境下生效-->
<pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} ‐‐‐‐> [%thread] ‐‐‐> %‐5level
%logger{50} ‐ %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} ==== [%thread] ==== %‐5level
%logger{50} ‐ %msg%n</pattern>
</springProfile>
切換日誌框架
按照slf4j的日誌適配圖,匯入相關的依賴和排除相應的依賴就可以了
例如切換為slf4j+log4j的方式;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback‐classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j‐over‐slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j‐log4j12</artifactId>
</dependency>
切換為切換為log4j2:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring‐boot‐starter‐logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐log4j2</artifactId>
</dependency>