Spring?Boot日志介紹和配置
1. 日志的介紹
在前面的學(xué)習(xí)中,控制臺(tái)上打印出來的一大堆內(nèi)容就是日志,可以幫助我們發(fā)現(xiàn)問題,分析問題,定位問題,除此之外,日志還可以進(jìn)行系統(tǒng)的監(jiān)控,數(shù)據(jù)采集等
2. 日志的使用
在程序中獲取日志對(duì)象需要使用日志工廠 LoggerFactory,然后調(diào)用 getLogger 方法,傳入?yún)?shù)用來標(biāo)識(shí)這個(gè)日志的名稱,這樣可以更清晰的知道是哪個(gè)類輸出的日志
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,日志實(shí)現(xiàn)相當(dāng)于入駐的商家,在使用時(shí)是使用淘寶,真正提供商品的還是商家
也就是使用時(shí)使用 SLF4J,真正實(shí)現(xiàn)功能還是日志實(shí)現(xiàn)的框架
3.1. SLF4J 框架的介紹
SLF4J 就是其他日志框架的門面,相當(dāng)于提供日志服務(wù)的統(tǒng)一 API 接口,并不涉及到具體的日志邏輯實(shí)現(xiàn),而是一個(gè)抽象層,對(duì)日志框架制定的一種規(guī)范、標(biāo)準(zhǔn)、接口。所有 SLF4J 并不能獨(dú)立使用,需要和具體的日志框架配合使用。
如果說不引入 SLF4J 的話
- 不同的日志框架的 API 接口和配置文件不同,如果多個(gè)日志框架共存,那么就需要維護(hù)多套配置文件
- 如果要更換日志框架,修改應(yīng)用程序代碼的過程中可能會(huì)出現(xiàn)一些代碼沖突
- 如果引入了多套第三方框架,也是需要維護(hù)這些配置的
引入門面日志框架之后,應(yīng)用程序和日志框架之間有了統(tǒng)一的 API 接口,此時(shí)應(yīng)用程序只需要維護(hù)一套日志文件配置即可,當(dāng)?shù)讓訉?shí)現(xiàn)框架改變時(shí),也不需要修改應(yīng)用程序代碼
3.2. 外觀模式
外觀模式(門面模式)提供了一個(gè)統(tǒng)一的接口,用來訪問子系統(tǒng)中的其他接口
SLF4J 就是外觀模式的典型應(yīng)用,但不僅僅使用了這一種設(shè)計(jì)模式
接下來以開燈的例子簡(jiǎn)單實(shí)現(xiàn)一下外觀模式:
首先定義一個(gè)接口:
public interface Light { void on(); void off(); }
然后定義兩個(gè)實(shí)現(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("打開臥室燈"); } }
如果說是之前的實(shí)現(xiàn)模式的話,需要在 Main 方法中去分別創(chuàng)建這兩個(gè)類的對(duì)象,然后調(diào)用方法,通過外觀模式的話,可以創(chuàng)建一個(gè)類,用來實(shí)現(xiàn)之前的過程
public class LightFacade { void lightOn(){ LivingRoomLight livingRoomLight = new LivingRoomLight(); livingRoomLight.on(); BedroomLight bedroomLight = new BedroomLight(); bedroomLight.on(); } }
這樣,即使實(shí)現(xiàn)類的方法發(fā)生改變,提供給用戶使用的接口還是不變的,用戶就不用考慮內(nèi)部是怎么實(shí)現(xiàn)的
4. 日志的級(jí)別
4.1. 級(jí)別的分類
日志的級(jí)別從高到低依次為:FATAL、ERROR、WARN、INFO、DEBUG、TRACE。
- FATAL:致命信息,表示需要立即被處理的系統(tǒng)級(jí)錯(cuò)誤。
- ERROR:錯(cuò)誤信息,級(jí)別較高的錯(cuò)誤日志信息,但仍然不影響系統(tǒng)的繼續(xù)運(yùn)行。
- WARN:警告信息,不影響使用,但需要注意的問題。
- INFO:普通信息,用于記錄應(yīng)用程序正常運(yùn)行時(shí)的一些信息,例如系統(tǒng)啟動(dòng)完成、請(qǐng)求處理完成等。
- DEBUG:調(diào)試信息,需要調(diào)試時(shí)候的關(guān)鍵信息打印。
- TRACE:追蹤信息,比 DEBUG 更細(xì)粒度的信息事件(除非有特殊用意,否則請(qǐng)使用 DEBUG 級(jí)別替代)
4.2. 級(jí)別的使用
創(chuàng)建 Logger 之后就可以調(diào)用方法區(qū)打印不同級(jí)別的日志,但是發(fā)現(xiàn)沒有 fatal 級(jí)別的信息,因?yàn)槌霈F(xiàn)這個(gè)問題已經(jīng)很嚴(yán)重了,不用通過日志就可以知道出現(xiàn)問題了
運(yùn)行之后發(fā)現(xiàn) debug 級(jí)別和 trace 級(jí)別的日志沒有打印出來,這是因?yàn)槟J(rèn)配置的日志級(jí)別是 info 級(jí)別的,所以比 info 級(jí)別低的就打印不出來
5. 日志的配置
5.1. 配置日志級(jí)別
可以通過配置日志級(jí)別來設(shè)置
配置之后就可以看到級(jí)別低的日志了
也可以分類配置日志的級(jí)別,指定某個(gè)類的日志級(jí)別顯示
logging: level: root: info com: example: log: controller: trace
5.2. 日志持久化
在上面打印的日志中,如果把 idea 關(guān)了,那么之前打印的日志就沒有了,如果說日志可以存儲(chǔ)到文件中,也就是存儲(chǔ)在硬盤上,就可以做到持久化,這樣出現(xiàn)問題就可以查之前的日志
還是可以通過配置,來實(shí)現(xiàn)日志的持久化
第一種方式是通過配置文件名的方式
配置之后再運(yùn)行的話,就會(huì)創(chuàng)建配置的文件夾和文件名,并且日志也存儲(chǔ)在了文件中
還有一種方式是只設(shè)置路徑
配置之后就會(huì)在設(shè)置的目錄下創(chuàng)建一個(gè) spring.log 文件夾,里面存儲(chǔ)的就是日志信息
5.3. 配置日志文件的分割
如果說所有日志都放在同一個(gè)文件中,那么這個(gè)文件肯定是越來越大的,就需要對(duì)日志文件進(jìn)行分割,日志框架默認(rèn)也設(shè)置了如果超過 10 M 就會(huì)分割
先來設(shè)置為 1KB 進(jìn)行分割
分割之后的文件名也是可以指定的
logback: rollingpolicy: max-file-size: 1KB file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
5.4. 配置日志格式
日志的格式也是可以控制的,
- % clr (表達(dá)式){顏色} 設(shè)置輸入日志的顏色。
- % d {${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和時(shí)間 -- 精確到毫秒。
- %5p 顯示日志級(jí)別 ERROR,WARN,INFO,DEBUG,TRACE。
- % t 線程名。% c 類的全限定名。% M method。% L 為行號(hào)。% thread 線程名稱。% m 或者 % msg 顯示輸出消息。% n 換行符。
- %5 若字符長(zhǎng)度小于 5,則右邊用空格填充。%-5 若字符長(zhǎng)度小于 5,則左邊用空格填充。%.15 若字符長(zhǎng)度超過 15,截去多余字符。%15.15 若字符長(zhǎng)度小于 15,則右邊用空格填充。若字符長(zhǎng)度超過 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 簡(jiǎn)化日志輸出
直接使用注解@Slf4j
,然后就不用再創(chuàng)建 Logger 的對(duì)象了,直接就可以調(diào)用方法
到此這篇關(guān)于Spring Boot日志介紹和配置的文章就介紹到這了,更多相關(guān)Spring Boot日志配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
為什么ConcurrentHashMap的key value不能為null,map可以?
這篇文章主要介紹了為什么ConcurrentHashMap的key value不能為null,map可以呢?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Mybatis中resultMap的Colum和property屬性詳解
這篇文章主要介紹了Mybatis中resultMap的Colum和property屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。2022-01-01java數(shù)組與以逗號(hào)分隔開的字符串的相互轉(zhuǎn)換操作
這篇文章主要介紹了java數(shù)組與以逗號(hào)分隔開的字符串的相互轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09Java 中函數(shù) Function 的使用和定義示例小結(jié)
這篇文章主要介紹了Java 中函數(shù) Function 的使用和定義小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07java使double保留兩位小數(shù)的多方法 java保留兩位小數(shù)
這篇文章主要介紹了java使double類型保留兩位小數(shù)的方法,大家參考使用吧2014-01-01淺談Java循環(huán)中的For和For-each哪個(gè)更快
本文主要介紹了淺談Java循環(huán)中的For和For-each哪個(gè)更快,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總(親測(cè)有效)
在IDEA中的pom文件中添加了依賴,并且正確加載了相應(yīng)依賴,pom文件沒有報(bào)紅,看起來像是把所有依賴庫(kù)全部加載進(jìn)來了,但是代碼中使用依賴的類庫(kù)使報(bào)紅,本文給大家介紹了IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總,需要的朋友可以參考下2024-06-06SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01