一、日志架構的了解
- 市面上的日志架構。分為日志門面和日志實作。
- Spring架構預設使用的JCL(也就是commons-logging)
- Spring Boot選用SLF4j和logback。
- JCL 最後更新在2014年,之後就沒有更新了。是以現在主要使用SLF4J來列印日志
- log4j、logback、slf4j都是一個人寫的。log4j存在缺陷是以有了logback。後來發現該有一個接口規範來定義,是以有了日志門面slf4j
- log4j2是Apache公司仿的log4j
日志門面 (日志的抽象層) | 日志實作 |
---|---|
JCL(Jakarta Commons Logging 2014年後不再更新) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
二、 SLF4j的使用 官網:https://www.slf4j.org
1、如何在系統中使用SLF4j
開發的時候日志記錄方法的調用,不應該直接調用日志的實作類,而是調用日志門面的方法。
導入slf4j的jar和logback的jar
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 本身的配置檔案(日志門面隻是一個接口,具體日志配置檔案還是日志實作的配置檔案)。
圖示(在官網中找到這張圖):隻要日志門面,沒有日志實作輸出為null; Spring Boot選用SLF4j日志門面和logback日志實作。
2、遺留問題
以前的系統并不是使用的SLF4j和logback日志架構,如Spring(commons-logging)、Hibernate(jboss-logging) 等架構如何統一使用slf4j進行日志輸出呢?解決辦法如:圖示(在官網中找到這張圖)
- 如何讓系統中所有的日志都統一到slf4j?
- 1、将系統中其他日志架構先排除出去;--先踢掉舊jar
- 2、用中間包(圖中的架構轉換包)來替換原先的日志架構;--偷梁換柱包
- 3、導入slf4j及其實作 。
3、 Spring Boot的日志關系
以圖示方式顯示Spring Boot的底層依賴關系 :右鍵--》Diagrams--》show dependencies
可以看到spring-boot-starter是一個基本依賴,spring-boot-starter--》spring-boot-starter-logging(SpringBoot使用它來做日志功能 )
- 總結:
- 1、SpringBoot底層使用slf4j+logback的方式來進行日志記錄
- 2、 SpringBoot把其他日志都替換成了slf4j,使用中間替換包
- 3、如何引入其他日志架構呢?一定要把架構預設的日志依賴移除。比如Spring架構使用的是commons-logging,Spring Boot是怎麼做的呢?在底層依賴關系上找到spring-boot-starter-logging,輕按兩下,可以看到移除了commons-logging依賴。
- 4、Spring Boot能自動适配所有的日志,底層使用slf4j+logback的方式來進行日志記錄。如果要引入其他日志架構,隻需要把預設依賴的日志架構排除,再引入新的日志依賴即可。
4、 Spring Boot的日志使用
1)、預設配置
Spring Boot預設幫我們配置好了日志:
// 記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
//日志的級别;
//由低到高 trace<debug<info<warn<error
//可以調整輸出的日志級别;日志就隻會在這個級别以後的進階别生效
logger.trace("這是trace日志...");
logger.debug("這是debug日志...");
//SpringBoot預設給我們使用的是info級别的,沒有指定級别的就用SpringBoot預設規定的級别;root級别
logger.info("這是info日志...");
logger.warn("這是warn日志...");
logger.error("這是error日志...");
}
預設的日志格式:${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}
日志輸出格式:
%d表示日期時間,
%thread表示線程名,線程id
%-5level:級别從左顯示5個字元寬度,-5是靠左對齊
%logger{50} 表示logger名字最長50個字元,否則按照句點分割。
%msg:日志消息,
%n是換行符
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
在哪裡看配置:logback下面的defaults.xml、file.appender.xml等檔案。意思是:超過10M之後,自動生成log2、log3等檔案
2)、如何修改SpringBoot的日志預設配置
logging.file.name | logging.file.path | Example | Description |
---|---|---|---|
(none) | (none) | 隻在控制台輸出(預設) | |
指定檔案名 | (none) | my.log | 輸出日志到my.log檔案 |
(none) | 指定目錄 | /var/log | 輸出到指定目錄的 spring.log 檔案中 |
3)、指定配置檔案
如果我們想自己寫日志的配置檔案,可以命名為
logback-spring.xml
或
logback.xml,推薦命名為
logback-spring.xml
Logging System | Customization(直接用以下檔案命名,架構自動加載.優先級比application.properties高) |
---|---|
Logback | , , or |
Log4j2 | or |
JDK (Java Util Logging) | |
-
logback.xml :直接被日志架構識别(而不是Spring Boot架構,不識别不處理)。
---如果使用logback.xml作為日志配置檔案,還要使用profile功能,會有以下錯誤:no applicable action for [springProfile]
- logback-spring.xml:由SpringBoot解析日志配置,可以使用Spring Boot的進階Profile功能。
<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> 可以指定某段配置隻在某個環境下生效 </springProfile> 如:在dev環境下和非dev環境下的不同輸出 <springProfile name="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>
5、切換日志架構
可以按照slf4j的日志适配圖,進行日志架構的切換。
(1)轉成slf4j+log4j的形式(并不推薦,logback是log4j的更新):①先移除
②可以看到如圖被移除了;
③再添加slf4j-log4j12的依賴即可。
(2)Spring Boot也支援slf4j+log4j2的starter。切換也很簡單,①排除依賴spring-boot-starter-logging;②添加依賴spring-boot-starter-log4j2