Spring?Boot日志介紹和配置
1. 日志的介紹
在前面的學(xué)習(xí)中,控制臺上打印出來的一大堆內(nèi)容就是日志,可以幫助我們發(fā)現(xiàn)問題,分析問題,定位問題,除此之外,日志還可以進(jìn)行系統(tǒng)的監(jiān)控,數(shù)據(jù)采集等

2. 日志的使用
在程序中獲取日志對象需要使用日志工廠 LoggerFactory,然后調(diào)用 getLogger 方法,傳入?yún)?shù)用來標(biāo)識這個日志的名稱,這樣可以更清晰的知道是哪個類輸出的日志
private static Logger logger = LoggerFactory.getLogger(CaptchaController.class);
System.out.println("System:" + code);
logger.info("Logger: " + code);
來看一下日志的格式:


應(yīng)用名稱可以在配置文件中進(jìn)行配置
3. 日志框架的介紹
日志門面就相當(dāng)于是淘寶 APP,日志實現(xiàn)相當(dāng)于入駐的商家,在使用時是使用淘寶,真正提供商品的還是商家
也就是使用時使用 SLF4J,真正實現(xiàn)功能還是日志實現(xiàn)的框架

3.1. SLF4J 框架的介紹
SLF4J 就是其他日志框架的門面,相當(dāng)于提供日志服務(wù)的統(tǒng)一 API 接口,并不涉及到具體的日志邏輯實現(xiàn),而是一個抽象層,對日志框架制定的一種規(guī)范、標(biāo)準(zhǔn)、接口。所有 SLF4J 并不能獨立使用,需要和具體的日志框架配合使用。
如果說不引入 SLF4J 的話
- 不同的日志框架的 API 接口和配置文件不同,如果多個日志框架共存,那么就需要維護(hù)多套配置文件
- 如果要更換日志框架,修改應(yīng)用程序代碼的過程中可能會出現(xiàn)一些代碼沖突
- 如果引入了多套第三方框架,也是需要維護(hù)這些配置的
引入門面日志框架之后,應(yīng)用程序和日志框架之間有了統(tǒng)一的 API 接口,此時應(yīng)用程序只需要維護(hù)一套日志文件配置即可,當(dāng)?shù)讓訉崿F(xiàn)框架改變時,也不需要修改應(yīng)用程序代碼
3.2. 外觀模式
外觀模式(門面模式)提供了一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的其他接口

SLF4J 就是外觀模式的典型應(yīng)用,但不僅僅使用了這一種設(shè)計模式
接下來以開燈的例子簡單實現(xiàn)一下外觀模式:
首先定義一個接口:
public interface Light {
void on();
void off();
}然后定義兩個實現(xiàn)類:
public class LivingRoomLight implements Light{
private static Logger logger = LoggerFactory.getLogger(LivingRoomLight.class);
@Override
public void on() {
logger.info("打開客廳燈");
}
@Override
public void off() {
logger.info("打開客廳燈");
}
}public class BedroomLight implements Light{
private static Logger logger = LoggerFactory.getLogger(BedroomLight.class);
@Override
public void on() {
logger.info("打開臥室燈");
}
@Override
public void off() {
logger.info("打開臥室燈");
}
}如果說是之前的實現(xiàn)模式的話,需要在 Main 方法中去分別創(chuàng)建這兩個類的對象,然后調(diào)用方法,通過外觀模式的話,可以創(chuàng)建一個類,用來實現(xiàn)之前的過程
public class LightFacade {
void lightOn(){
LivingRoomLight livingRoomLight = new LivingRoomLight();
livingRoomLight.on();
BedroomLight bedroomLight = new BedroomLight();
bedroomLight.on();
}
}這樣,即使實現(xiàn)類的方法發(fā)生改變,提供給用戶使用的接口還是不變的,用戶就不用考慮內(nèi)部是怎么實現(xiàn)的
4. 日志的級別
4.1. 級別的分類
日志的級別從高到低依次為:FATAL、ERROR、WARN、INFO、DEBUG、TRACE。
- FATAL:致命信息,表示需要立即被處理的系統(tǒng)級錯誤。
- ERROR:錯誤信息,級別較高的錯誤日志信息,但仍然不影響系統(tǒng)的繼續(xù)運行。
- WARN:警告信息,不影響使用,但需要注意的問題。
- INFO:普通信息,用于記錄應(yīng)用程序正常運行時的一些信息,例如系統(tǒng)啟動完成、請求處理完成等。
- DEBUG:調(diào)試信息,需要調(diào)試時候的關(guān)鍵信息打印。
- TRACE:追蹤信息,比 DEBUG 更細(xì)粒度的信息事件(除非有特殊用意,否則請使用 DEBUG 級別替代)

4.2. 級別的使用
創(chuàng)建 Logger 之后就可以調(diào)用方法區(qū)打印不同級別的日志,但是發(fā)現(xiàn)沒有 fatal 級別的信息,因為出現(xiàn)這個問題已經(jīng)很嚴(yán)重了,不用通過日志就可以知道出現(xiàn)問題了

運行之后發(fā)現(xiàn) debug 級別和 trace 級別的日志沒有打印出來,這是因為默認(rèn)配置的日志級別是 info 級別的,所以比 info 級別低的就打印不出來

5. 日志的配置
5.1. 配置日志級別
可以通過配置日志級別來設(shè)置

配置之后就可以看到級別低的日志了

也可以分類配置日志的級別,指定某個類的日志級別顯示
logging:
level:
root: info
com:
example:
log:
controller: trace5.2. 日志持久化
在上面打印的日志中,如果把 idea 關(guān)了,那么之前打印的日志就沒有了,如果說日志可以存儲到文件中,也就是存儲在硬盤上,就可以做到持久化,這樣出現(xiàn)問題就可以查之前的日志
還是可以通過配置,來實現(xiàn)日志的持久化
第一種方式是通過配置文件名的方式

配置之后再運行的話,就會創(chuàng)建配置的文件夾和文件名,并且日志也存儲在了文件中

還有一種方式是只設(shè)置路徑

配置之后就會在設(shè)置的目錄下創(chuàng)建一個 spring.log 文件夾,里面存儲的就是日志信息

5.3. 配置日志文件的分割
如果說所有日志都放在同一個文件中,那么這個文件肯定是越來越大的,就需要對日志文件進(jìn)行分割,日志框架默認(rèn)也設(shè)置了如果超過 10 M 就會分割

先來設(shè)置為 1KB 進(jìn)行分割

分割之后的文件名也是可以指定的
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i5.4. 配置日志格式
日志的格式也是可以控制的,

- % clr (表達(dá)式){顏色} 設(shè)置輸入日志的顏色。
- % d {${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和時間 -- 精確到毫秒。
- %5p 顯示日志級別 ERROR,WARN,INFO,DEBUG,TRACE。
- % t 線程名。% c 類的全限定名。% M method。% L 為行號。% thread 線程名稱。% m 或者 % msg 顯示輸出消息。% n 換行符。
- %5 若字符長度小于 5,則右邊用空格填充。%-5 若字符長度小于 5,則左邊用空格填充。%.15 若字符長度超過 15,截去多余字符。%15.15 若字符長度小于 15,則右邊用空格填充。若字符長度超過 15,截去多余字符。
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'6. lombok 簡化日志輸出
直接使用注解@Slf4j,然后就不用再創(chuàng)建 Logger 的對象了,直接就可以調(diào)用方法

到此這篇關(guān)于Spring Boot日志介紹和配置的文章就介紹到這了,更多相關(guān)Spring Boot日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
為什么ConcurrentHashMap的key value不能為null,map可以?
這篇文章主要介紹了為什么ConcurrentHashMap的key value不能為null,map可以呢?具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Mybatis中resultMap的Colum和property屬性詳解
這篇文章主要介紹了Mybatis中resultMap的Colum和property屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01
java數(shù)組與以逗號分隔開的字符串的相互轉(zhuǎn)換操作
這篇文章主要介紹了java數(shù)組與以逗號分隔開的字符串的相互轉(zhuǎn)換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java 中函數(shù) Function 的使用和定義示例小結(jié)
這篇文章主要介紹了Java 中函數(shù) Function 的使用和定義小結(jié),本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07
java使double保留兩位小數(shù)的多方法 java保留兩位小數(shù)
這篇文章主要介紹了java使double類型保留兩位小數(shù)的方法,大家參考使用吧2014-01-01
淺談Java循環(huán)中的For和For-each哪個更快
本文主要介紹了淺談Java循環(huán)中的For和For-each哪個更快,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
IDEA中Maven報錯Cannot resolve xxx的解決方法匯總(親測有效)
在IDEA中的pom文件中添加了依賴,并且正確加載了相應(yīng)依賴,pom文件沒有報紅,看起來像是把所有依賴庫全部加載進(jìn)來了,但是代碼中使用依賴的類庫使報紅,本文給大家介紹了IDEA中Maven報錯Cannot resolve xxx的解決方法匯總,需要的朋友可以參考下2024-06-06
SpringBoot如何進(jìn)行業(yè)務(wù)校驗實例詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-01-01

