chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot日志學(xué)習(xí)筆記

jf_ro2CN3Fa ? 來源:CSDN-戰(zhàn)斧 ? 2023-09-21 15:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、日志重要嗎

程序中的日志重要嗎? 在回答這個(gè)問題前,筆者先說個(gè)事例:

筆者印象尤深的就是去年某個(gè)同事,收到了客戶反饋的緊急bug。盡管申請到了日志文件,但因?yàn)楹芏嚓P(guān)鍵步驟沒有打印日志,導(dǎo)致排查進(jìn)度很慢,數(shù)個(gè)小時(shí)都沒能排查到問題,也無法給出解決對策。導(dǎo)致了客戶程序一直阻斷,最終產(chǎn)生了不少損失。 事后,經(jīng)過仔細(xì)推敲,成功復(fù)現(xiàn)了這個(gè)bug,其實(shí)是一個(gè)很不起眼的數(shù)據(jù)轉(zhuǎn)換導(dǎo)致的??梢?yàn)槿罩緝?nèi)容的匱乏,排查起來難度很大。其實(shí)只要在數(shù)據(jù)轉(zhuǎn)換前后進(jìn)行日志輸出,這個(gè)問題就是一眼的事。但可惜沒如果,故事的最后,開發(fā)部門還是遭到了客戶的投訴,影響到了部門績效

對于剛學(xué)習(xí)編程的同學(xué),很多人都對日志滿不在乎,我們在做code review的時(shí)候,經(jīng)常發(fā)現(xiàn)一些新同學(xué)喜歡一個(gè)方法寫得很長,然后中間的注釋和日志都少的可憐。

坦白的說,這是很不好的習(xí)慣,這意味著日后方法出了bug,或者需要迭代,要花費(fèi)大量時(shí)間來理清方法的思路。千萬別迷信什么“方法名、字段名起的見明知意,就可以不寫注釋與日志”,那是他們的業(yè)務(wù)場景不夠復(fù)雜。以筆者為例,復(fù)雜的場景涉及很多公式、奇特的規(guī)定,不寫注釋與日志,后續(xù)沒人能維護(hù)得了

所以請務(wù)必記住,日志在開發(fā)過程中非常重要。它可以幫助開發(fā)人員了解程序中發(fā)生了什么,以及在某些情況下為什么會發(fā)生錯(cuò)誤或異常。通過查看日志,開發(fā)人員可以輕松地定位并解決問題,并且可以更好地監(jiān)控和調(diào)整應(yīng)用程序的性能,在必要時(shí)進(jìn)行故障排除和安全檢查

08e8c1e0-581f-11ee-939d-92fbcf53809c.png

二、日志分級

最開始的日志分級是由Syslog的開發(fā)者Eric Allman在1981年提出的。之后,這個(gè)級別分級系統(tǒng)被廣泛應(yīng)用于各種領(lǐng)域的日志記錄和信息處理中。下面我們就來介紹下常用的日志等級

TRACE

是最低級別的日志記錄,用于輸出最詳細(xì)的調(diào)試信息,通常用于開發(fā)調(diào)試目的。在生產(chǎn)環(huán)境中,應(yīng)該關(guān)閉 TRACE 級別的日志記錄,以避免輸出過多無用信息。

DEBUG

是用于輸出程序中的一些調(diào)試信息,通常用于開發(fā)過程中。像 TRACE 一樣,在生產(chǎn)環(huán)境中應(yīng)該關(guān)閉 DEBUG 級別的日志記錄。

INFO

用于輸出程序正常運(yùn)行時(shí)的一些關(guān)鍵信息,比如程序的啟動、運(yùn)行日志等。通常在生產(chǎn)環(huán)境中開啟 INFO 級別的日志記錄。

WARN

是用于輸出一些警告信息,提示程序可能會出現(xiàn)一些異?;蛘咤e(cuò)誤。在應(yīng)用程序中,WARN 級別的日志記錄通常用于記錄一些非致命性異常信息,以便能夠及時(shí)發(fā)現(xiàn)并處理這些問題。

ERROR

是用于輸出程序運(yùn)行時(shí)的一些錯(cuò)誤信息,通常表示程序出現(xiàn)了一些不可預(yù)料的錯(cuò)誤。在應(yīng)用程序中,ERROR 級別的日志記錄通常用于記錄一些致命性的異常信息,以便能夠及時(shí)發(fā)現(xiàn)并處理這些問題。

當(dāng)然,除了這五種級別以外,還有一些日志框架定義了其他級別,例如 Python 中的 CRITICAL、PHP 中的 FATAL 等。CRITICAL 和 FATAL 都是用于表示程序出現(xiàn)了致命性錯(cuò)誤或者異常,即不可恢復(fù)的錯(cuò)誤。當(dāng)然,對于我們今天要說的內(nèi)容,知道上述五種日志等級就夠了。

三、常用日志插件

Log4j(1999年誕生)

Log4j 是Java領(lǐng)域中最早的流行日志框架之一。它由Ceki Gülcü開發(fā),并后來由Apache軟件基金會接管。Log4j 提供了靈活的配置選項(xiàng)、多種輸出目的地、日志級別和分層日志體系。盡管Log4j 1在其時(shí)代取得了巨大的成功,但在性能和某些功能方面存在限制,因此后來演化為Log4j 2。

SLF4J(2004年誕生)

嚴(yán)格來說,SLF4J(Simple Logging Facade for Java)并不算一個(gè)插件,而是Ceki Gülcü開發(fā)的一個(gè)日志門面接口。它為Java應(yīng)用程序提供了統(tǒng)一的日志抽象,使開發(fā)人員可以使用一致的API進(jìn)行日志記錄,而不需要直接依賴于特定的日志實(shí)現(xiàn)。SLF4J 可以與多種底層日志框架(如Logback、Log4j 2、java.util.logging等)結(jié)合使用。

Logback(2009年誕生)

Logback 是Ceki Gülcü開發(fā)的日志框架,他也是Log4j的作者。Logback 是Log4j 1的后續(xù)版本,旨在提供更高性能、更靈活的配置和現(xiàn)代化的日志解決方案。Logback 支持異步日志記錄、多種輸出格式、靈活的配置以及與SLF4J緊密集成。

Log4j 2(2014年誕生)

Log4j 2 是Apache軟件基金會開發(fā)的Log4j的下一代版本。它引入了許多新特性,如異步日志記錄、插件支持、豐富的過濾器等,旨在提供更好的性能和靈活性。Log4j 2 在設(shè)計(jì)上考慮了Log4j 1的局限性,并且支持多種配置方式。

小故事

不難注意到,一個(gè)有意思的小故事是,前三款日志插件都是Ceki Gülcü開發(fā)的,但 Log4j 2 并不是,雖然現(xiàn)在有很多人以為log4j2也是他寫的,但我們在github上可以看到其個(gè)人說明 “Unaffiliated with log4j 2.x.” (與 log4j 2.x 無關(guān)),所以log4j2 和 logback 都自稱是log4j 的后續(xù)版本,到底誰才算正統(tǒng)續(xù)作呢?這就留給各位讀者自己玩味了

08fc2c80-581f-11ee-939d-92fbcf53809c.png

四、外觀模式與SLF4J

在講解更多插件詳情之前,我們先來看看使用最多的SLF4J ,我們前面說了 SLF4J(Simple Logging Facade for Java)是Ceki Gülcü開發(fā)的一個(gè)日志門面接口,那么很顯然這里就用到了門面模式(即Facade 或 外觀模式),筆者比較習(xí)慣說成是外觀模式,后續(xù)就稱為外觀模式。

09435ed4-581f-11ee-939d-92fbcf53809c.png

1. 外觀模式

定義:外觀模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它提供了一個(gè)簡單的接口,封裝了底層復(fù)雜的子系統(tǒng),使得客戶端可以更方便地使用這個(gè)子系統(tǒng)

目的:外觀模式的目的是隱藏底層系統(tǒng)的復(fù)雜性,降低訪問成本。

如果說看定義有些抽象,那我們可以以生活中的例子來說,我們都知道現(xiàn)在越來越流行智能家居,也就是家庭內(nèi)裝了很多智能家電,從電視、空調(diào)、到廊燈甚至窗簾都是智能的。這類家庭往往會有一個(gè)控制中心,我們不需要手動去開電視,只需要對著控制中心說:“小A小A,幫我打開電視,音量調(diào)到30%”,電視就會應(yīng)聲打開并調(diào)節(jié)音量

那么這樣的話,我們不需要知道怎么開電視,怎么調(diào)音量。通通都能用最簡單的話語來調(diào)節(jié)。同理,現(xiàn)在手機(jī)上的拍照功能:感光度,對焦,白平衡這些細(xì)節(jié)都給你自動完成了,所以這些復(fù)雜的內(nèi)容你現(xiàn)在根本不用管,只需要猛按拍照鍵即可。

這就是外觀模式的意義,外觀模式就是為了隱藏系統(tǒng)的復(fù)雜性而設(shè)計(jì)出來的,讓客戶端只對接觸到一個(gè)外觀類,而不會接觸到系統(tǒng)內(nèi)部的復(fù)雜邏輯

2. SLF4J 的誕生

在早期使用日志框架時(shí),應(yīng)用程序通常需要直接與具體的日志框架進(jìn)行耦合,這就導(dǎo)致了以下幾個(gè)問題:

代碼依賴性

應(yīng)用程序需要直接引用具體的日志框架,從而導(dǎo)致代碼與日志框架強(qiáng)耦合,難以滿足應(yīng)用程序?qū)θ罩究蚣艿撵`活配置。

日志框架不統(tǒng)一

在使用不同的日志框架時(shí),應(yīng)用程序需要根據(jù)具體的日志框架來編寫代碼,這不僅會增加開發(fā)難度,而且在多種日志框架中切換時(shí)需要進(jìn)行大量的代碼改動。

性能問題

在日志輸出頻繁的情況下,由于日志框架的實(shí)現(xiàn)方式和API設(shè)計(jì)不同,可能會導(dǎo)致性能問題。

為了解決這些問題,SLF4J提供了一套通用的日志門面接口,讓應(yīng)用程序可以通過這些接口來記錄日志信息,而不需要直接引用具體的日志框架。這樣,應(yīng)用程序就可以在不同的日志框架之間進(jìn)行靈活配置和切換,同時(shí)還可以獲得更好的性能表現(xiàn)。所以,我強(qiáng)烈建議各位使用SLF4J, 而不是直接對接某個(gè)具體的日志框架。

3. SLF4J 的使用

首先,我們需要在工程內(nèi)引入包,但是如果你用了springboot,各種 spring-boot-starter 啟動器已經(jīng)引用過了,所以引用前最好確認(rèn)下:


org.slf4j
slf4j-api
1.7.32

然后在我們要打印日志的類里加上一行 ;private static final Logger logger = LoggerFactory.getLogger(XXXX.class); 即可使用,如下:

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;

publicclassMyClass{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(MyClass.class);
//...
publicstaticvoidmain(String[]args){
log.info("Thisisaninfomessage.");
}
}

如果我們引用了lombok的話,也可以使用lombok的注解@Slf4j 代替上面那句話來使用 SLF4J ,如下:

importlombok.extern.slf4j.Slf4j;

@Slf4j
publicclassMyClass{
publicstaticvoidmain(String[]args){
log.info("Thisisaninfomessage.");
}
}

但是,我們都知道SLF4J僅僅是個(gè)門面,換句話說,僅有接口而沒有實(shí)現(xiàn),如果此刻我們直接運(yùn)行,打印日志是沒有用處的

0988a174-581f-11ee-939d-92fbcf53809c.png

所以,我們?nèi)绻\(yùn)行,我們必須要給 SLF4J 安排上實(shí)現(xiàn),而目前最常用的就是 logback 和 log4j2 了,就讓我們接著往下看

五、雙雄之爭

其實(shí)關(guān)于 Logback 和 Log4j 2,網(wǎng)絡(luò)上有很多評測,就不需贅述了,主要是圍繞性能方面的,從目前大家的反饋看,Log4j 2 晚出現(xiàn)好幾年,還是有后發(fā)優(yōu)勢的,性能會比 Logback 好。當(dāng)然, Logback 本身性能也很強(qiáng),對于大多數(shù)場景,完全是夠用的,而且配置比較直觀,是spring-boot 默認(rèn)使用的日志插件。

0994d868-581f-11ee-939d-92fbcf53809c.png

所以,選誰都可以,如果不想費(fèi)神,可以直接使用spring-boot自帶的Logback,如果對日志性能要求很高,使用log4j2更保險(xiǎn),我們接下來分別介紹兩者。

1. Logback

1. 引用

由于 Logback 為 spring-boot 默認(rèn)日志框架,所以無需再引用,但對于非spring - boot 項(xiàng)目,可以做如下引用


ch.qos.logback
logback-classic
1.2.12

Logback 的核心模塊為 logback-classic,它提供了一個(gè) SLF4J 的實(shí)現(xiàn),兼容 Log4j API,可以無縫地替換 Log4j。它自身已經(jīng)包含了 logback-core 模塊,而 logback-core,顧名思義就是 logback 的核心功能,包括日志記錄器、Appender、Layout 等。其他 logback 模塊都依賴于該模塊

2. 配置

logback 可以通過 XML 或者 Groovy 配置。下面以 XML 配置為例。logback 的 XML 配置文件名稱通常為 logback.xml 或者 logback-spring.xml(在 Spring Boot 中),需要放置在 classpath 的根目錄下,



 


 


 


%-5relative[%thread]%-5level%logger{35}-%msg%n



 




 


 


 


 

${LOG_PATH}/app.log

 
50MB
 
${ARCHIVE_PATTERN}
30
 

50MB

 
true


%d{yyyy-MM-ddHHss.SSS}[%thread]%-5level%logger{35}-%msg%n



 




 

0
256



 





其中,主要包括以下配置:

springProperty 定義了 log 文件的存儲路徑,可以通過 Spring 的屬性文件配置方式進(jìn)行設(shè)置,如果沒有配置則默認(rèn)存儲在 logs 目錄下。

appender 定義了日志輸出的目標(biāo),這里包括了控制臺輸出和文件輸出兩種,具體可以根據(jù)需求進(jìn)行配置。

root 定義了默認(rèn)的日志級別和輸出目標(biāo),默認(rèn)情況下,INFO 級別以上的日志信息會輸出到控制臺,可以根據(jù)實(shí)際需求進(jìn)行修改。

logger 定義了不同組件的日志級別和輸出目標(biāo),例如,這里定義了 com.example 這個(gè)組件的日志級別為 DEBUG,而 com.example.demo 這個(gè)組件的日志級別為 ERROR,并將其輸出到文件中。

rollingPolicy 定義了日志文件的切割規(guī)則和歸檔策略,此處定義了日志文件每個(gè) 50MB 進(jìn)行切割,每天生成一個(gè)日志文件,并且壓縮和刪除過期文件,最多保留 30 天的日志文件。

encoder 定義了日志信息的輸出格式,具體的格式可以自行定義。

asyncAppender 定義了異步輸出日志的方式,對于高并發(fā)時(shí),可以使用異步輸出來提高系統(tǒng)的性能。

discardingThreshold 定義了異步輸出隊(duì)列的閾值,當(dāng)隊(duì)列中的數(shù)據(jù)量超過此值時(shí),會丟棄最早放入的數(shù)據(jù),此處設(shè)置為 0 表示隊(duì)列不會丟棄任何數(shù)據(jù)。

queueSize 定義了異步輸出隊(duì)列的大小,當(dāng)隊(duì)列滿時(shí),會等待隊(duì)列中的數(shù)據(jù)被消費(fèi)后再將數(shù)據(jù)放入隊(duì)列中,此處設(shè)置為 256。

3. 演示

我們新建一個(gè)普通工程(非spring工程),引用Logback后,把上述配置文件復(fù)制進(jìn)logback.xml,然后將工程結(jié)構(gòu)設(shè)置成如下模式

09a25998-581f-11ee-939d-92fbcf53809c.png

其中兩個(gè)類的代碼如下:

publicclassMain{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(Main.class);
publicstaticvoidmain(String[]args){
log.trace("ThisisaMaintracemessage.");
log.debug("ThisisaMaindebugmessage.");
log.info("ThisisaMaininfomessage.");
log.warn("ThisisaMainwarnmessage.");
log.error("ThisisaMainerrormessage.");
Slave.main(args);
}
}

publicclassSlave{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(Slave.class);
publicstaticvoidmain(String[]args){
log.trace("ThisisaSlavetracemessage.");
log.debug("ThisisaSlavedebugmessage.");
log.info("ThisisaSlaveinfomessage.");
log.warn("ThisisaSlavewarnmessage.");
log.error("ThisisaSlaveerrormessage.");
}
}

我們想實(shí)現(xiàn)這樣的效果,首先日志要同時(shí) 輸出到控制臺 及 日志文件,且不同層級的代碼,輸出的日志層級也不同。那么我們可以對上述的xml做出一些調(diào)整:

因?yàn)槭欠荢pring項(xiàng)目,所以 springProperty 這樣的標(biāo)簽就不要用了,我們直接寫死一個(gè)日志文件地址即可。

 

去掉原有的那些root、logger標(biāo)簽,我們自己新建兩個(gè)logger,用于兩個(gè)不同的層級。我們想里層輸出 debug 級別,外層輸出info 級別,我們可以這么設(shè)置。并且同時(shí)輸出到控制臺及日志文件









當(dāng)我們運(yùn)行Main.main的時(shí)候,就可以得到以下日志,slave 能輸出debug級別,Main 只能輸出 info及以上級別

09a7de5e-581f-11ee-939d-92fbcf53809c.png

4. 細(xì)節(jié)點(diǎn)

其實(shí)我們上面的演示,有兩個(gè)細(xì)節(jié)點(diǎn),需要注意一下。一個(gè)就是我們的


使用了一個(gè) additivity="false" 的屬性,這其實(shí)是因?yàn)?logger 這個(gè)標(biāo)簽在鎖定某個(gè)目錄時(shí),可能會發(fā)生層級關(guān)系。比如我們的兩個(gè) logger, 一個(gè)針對的目錄是 com.zhanfu 另一個(gè)是 com.zhanfu.child ,后者就會被前者包含。

當(dāng)我們的 com.zhanfu.child.Slave 打印日志時(shí),當(dāng)然會使用后者(更精確)的設(shè)置,但前者的設(shè)置還使用嗎?就依賴于 additivity=“false”,此處如果我們把 additivity="false" (該屬性默認(rèn)值為true)去掉,再來打印日志

09b74f2e-581f-11ee-939d-92fbcf53809c.png

就會發(fā)現(xiàn),Slave 的日志打了兩遍,而且連 debug 級別的都打了兩遍,我們可以把這種邏輯理解為繼承,子類執(zhí)行一遍,父類還能在執(zhí)行一遍,但 leve 屬性還是會采用子類而非父類的。

另一點(diǎn)就是我們把 root 標(biāo)簽刪除了,root 其實(shí)是一個(gè)頂級的 logger , 其他的logger都可以視為它的子類,如果那些logger存在沒涵蓋的地方,或其沒有指定 additivity="false" ,那最后root的設(shè)置就會被使用。比如我們將設(shè)置改為如下:












結(jié)果控制臺的輸出日志,Main會重復(fù)兩次,Slave 會重復(fù)三次,如下

09bffdea-581f-11ee-939d-92fbcf53809c.png

但是因?yàn)槲覀兊?root 只配置了控制臺輸出,所以日志文件里還是不會變的

09dd5552-581f-11ee-939d-92fbcf53809c.png

2. Log4j 2

1. 引用

對于spring-boot項(xiàng)目,除了引用 Log4j 2 我們還需要先剔除 Logback 的引用,對于普通項(xiàng)目,我們只需直接引用即可。但注意我們的原則,通過 SLF4J 來使用 Log4j2,所以引用下面這個(gè)包


org.apache.logging.log4j
log4j-slf4j-impl
2.13.3

其內(nèi)包含 Log4j2 的實(shí)現(xiàn),和 SLF4J 的 API,如下:

09f0c9ca-581f-11ee-939d-92fbcf53809c.png

2. 配置

Log4j2 的配置邏輯和 logback 是類似的,只有些細(xì)節(jié)不同,比如Logger 的首字母大寫等等,最后我們寫下這樣一個(gè) log4j2.xml




logs



























Properties

部分定義了一個(gè) logPath 屬性,方便在其他地方引用。

Appenders

定義了兩個(gè) Appender:Console 和 RollingFile,分別將日志輸出到控制臺和文件中。RollingFile 使用了 RollingFileAppender,并設(shè)置了日志滾動策略和默認(rèn)的備份文件數(shù)量。

Loggers

定義了三個(gè) Logger:com.zhanfu.child 的日志級別為 DEBUG,com.zhanfu 的日志級別為INFO,Root Logger 的日志級別為 WARN。并指定了兩個(gè) Appender:Console 和 File。

3. 演示

由于我們的配置邏輯沒變,所以日志的結(jié)果還是一樣的:

0a02107c-581f-11ee-939d-92fbcf53809c.png0a2128ea-581f-11ee-939d-92fbcf53809c.png

3. 對比

Log4j2和Logback都是Java應(yīng)用程序中最流行的日志框架之一。它們均具備高度的可配置性和使用靈活性,并提供了一系列有用的功能,例如異步日志記錄和日志過濾等。下面從配置遍歷性、功能性、性能等方面進(jìn)行比較和總結(jié)。

配置遍歷性

Logback的配置文件格式相對簡單,易于閱讀和修改。它支持符號來引用變量、屬性和環(huán)境變量等。此外,它還支持條件日志記錄(根據(jù)日志級別、日志記錄器名稱或時(shí)間等),以及滾動文件的大小或日期等。

Log4j2的配置文件格式較復(fù)雜,但它在配置文件中提供了大量的選項(xiàng)來控制日志記錄。它支持在配置文件中直接聲明上下文參數(shù)、過濾器、輸出器和Appender等,這使得它的配置更加靈活。此外,Log4j2還支持異步日志記錄、日志事件序列化和性能優(yōu)化等。

總體來說,兩者都很好地支持了配置遍歷性,但Log4j2提供了更多的選項(xiàng)和更高的靈活性。

功能性

Logback提供了一系列基本的日志記錄功能,例如異步Appender、滾動文件和GZIP壓縮等。它還支持與SLF4J一起使用,可以很容易地與其他日志框架集成。

Log4j2提供了更多的高級功能,例如異步日志記錄、性能優(yōu)化和日志事件序列化等。它還支持Lambda表達(dá)式,可以使日志記錄器更加簡潔和易讀。此外,Log4j2還支持Flume和Kafka等大數(shù)據(jù)處理框架,可以方便地將日志記錄發(fā)送到這些框架中。

總體來說,Log4j2提供了更多的高級功能,并且可以更好地與大數(shù)據(jù)處理框架集成。

性能

Logback的性能很好,可以處理高吞吐量的日志記錄。它采用了異步記錄器,利用了多線程來提高性能。

Log4j2在性能方面更加強(qiáng)大。它使用了異步記錄器和多線程,還引入了RingBuffer數(shù)據(jù)結(jié)構(gòu)和Disruptor庫來加速日志事件的傳遞和處理。這使得它比Logback具有更高的吞吐量和更低的延遲。

綜上所述,Log4j2在配置靈活性、功能性和性能方面都比Logback更為強(qiáng)大。但如果需要輕量級的日志框架或者只需要基本的日志記錄功能,Logback也是一個(gè)不錯(cuò)的選擇

但如果我們同時(shí)引用了這兩者,會報(bào)錯(cuò)嗎?還是會使用其中的某一個(gè)?


ch.qos.logback
logback-classic
1.2.12


org.apache.logging.log4j
log4j-slf4j-impl
2.13.3

可以看到,SLF4J 發(fā)現(xiàn)了系統(tǒng)中同時(shí)存在兩個(gè)插件框架,并最終選擇了使用 Logback

0a2a99b6-581f-11ee-939d-92fbcf53809c.png

總結(jié)

學(xué)習(xí)完本文,你應(yīng)當(dāng)對現(xiàn)在這幾個(gè)常用框架的有所了解,并能基礎(chǔ)應(yīng)用了。此次我們沒有講源碼,也沒有深入的講其配置及進(jìn)階使用,這些我們會在后面慢慢學(xué)習(xí)。但現(xiàn)在我希望你能知道的是。一定要寫好日志,一定要寫好日志,一定要寫好日志。重要的事情說三遍!這是區(qū)別新人和老鳥的一個(gè)重要依據(jù),也是讓自己排查問題更輕松的不二法門!

另外,現(xiàn)在很多中間件都自己引用了日志插件,我們作為一個(gè)整體工程在使用中間件時(shí),要及時(shí)發(fā)現(xiàn)并解決插件沖突,避免我們自己的日志配置失效,這也是一個(gè)程序員該注意的點(diǎn)。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3339

    瀏覽量

    59706
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    341

    瀏覽量

    15579
  • 日志
    +關(guān)注

    關(guān)注

    0

    文章

    145

    瀏覽量

    10996
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    154

    瀏覽量

    37301
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4848

    瀏覽量

    88953

原文標(biāo)題:忽視日志吃大虧,手把手教你玩轉(zhuǎn) SpringBoot 日志

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Spring Boot如何實(shí)現(xiàn)異步任務(wù)

    Spring Boot 提供了多種方式來實(shí)現(xiàn)異步任務(wù),這里介紹三種主要實(shí)現(xiàn)方式。 1、基于注解 @Async @Async 注解是 Spring 提供的一種輕量級異步方法實(shí)現(xiàn)方式,它可以標(biāo)記在方法上
    的頭像 發(fā)表于 09-30 10:32 ?1901次閱讀

    Spring Boot Starter需要些什么

    pulsar-spring-boot-starter是非常有必要的,在此之前,我們先看看一個(gè)starter需要些什么。 Spring Boot Starter spring-boot
    的頭像 發(fā)表于 09-25 11:35 ?1194次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> Starter需要些什么

    啟動Spring Boot項(xiàng)目應(yīng)用的三種方法

    所有的框架。Spring Boot作為Spring MVC的升級版,但是卻沒有太多的聯(lián)系,換句話說你學(xué)習(xí)Spring
    發(fā)表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目標(biāo)是構(gòu)建“非常容易創(chuàng)建、獨(dú)立、產(chǎn)品級別的基于Spring的應(yīng)用”。這些應(yīng)
    發(fā)表于 12-16 07:57

    java 日志框架Spring Boot分析

    引言:我們需要在已有的微服務(wù)代碼中添加日志功能,用于輸出需要關(guān)注的內(nèi)容,這是最平常的技術(shù)需求了。由于我們的微服務(wù)代碼是基于SpringBoot開發(fā)的,那么問題就轉(zhuǎn)換為如何在Spring Boot
    發(fā)表于 09-28 14:58 ?0次下載

    Spring Boot從零入門1 詳述

    在開始學(xué)習(xí)Spring Boot之前,我之前從未接觸過Spring相關(guān)的項(xiàng)目,Java基礎(chǔ)還是幾年前自學(xué)的,現(xiàn)在估計(jì)也忘得差不多了吧,寫Spring
    的頭像 發(fā)表于 12-10 22:18 ?978次閱讀

    學(xué)習(xí)Spring Boot 嵌入式服務(wù)器

    嵌入式Web服務(wù)器每個(gè)Spring Boot Web應(yīng)用程序都包含一個(gè)嵌入式Web服務(wù)器。此功能會導(dǎo)致許多操作方法問題,包括如何更改嵌入式服務(wù)器以及如何配置嵌入式服務(wù)器。本節(jié)回答了這些問題。摘譯自
    發(fā)表于 10-20 15:36 ?7次下載
    <b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 嵌入式服務(wù)器

    Spring Boot特有的實(shí)踐

    Spring Boot是最流行的用于開發(fā)微服務(wù)的Java框架。在本文中,我將與你分享自2016年以來我在專業(yè)開發(fā)中使用Spring Boot所采用的最佳實(shí)踐。這些內(nèi)容是基于我的個(gè)人經(jīng)驗(yàn)
    的頭像 發(fā)表于 09-29 10:24 ?1297次閱讀

    強(qiáng)大的Spring Boot 3.0要來了

    來源:OSC開源社區(qū)(ID:oschina2013) Spring Boot 3.0 首個(gè) RC 已發(fā)布,此外還為兩個(gè)分支發(fā)布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的頭像 發(fā)表于 10-31 11:17 ?2563次閱讀

    Spring Boot Web相關(guān)的基礎(chǔ)知識

    上一篇文章我們已經(jīng)學(xué)會了如何通過IDEA快速建立一個(gè)Spring Boot項(xiàng)目,還介紹了Spring Boot項(xiàng)目的結(jié)構(gòu),介紹了項(xiàng)目配置文件pom.xml的組成部分,并且撰寫了我們
    的頭像 發(fā)表于 03-17 15:03 ?1054次閱讀

    Spring Boot日志框架使用

    目前市面上常見的日志框架有:slf4j(Simple Logging Facade for Java)、logback、log4j、log4j2、commons-logging(Spring默認(rèn)日志框架)、JUL(java.ut
    的頭像 發(fā)表于 06-02 10:59 ?1335次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的<b class='flag-5'>日志</b>框架使用

    Spring Boot Actuator快速入門

    一下 Spring Boot Actuator ,學(xué)習(xí)如何在 Spring Boot 2.x 中使用、配置和擴(kuò)展這個(gè)監(jiān)控工具。
    的頭像 發(fā)表于 10-09 17:11 ?1051次閱讀

    Spring Boot啟動 Eureka流程

    在上篇中已經(jīng)說過了 Eureka-Server 本質(zhì)上是一個(gè) web 應(yīng)用的項(xiàng)目,今天就來看看 Spring Boot 是怎么啟動 Eureka 的。 Spring Boot 啟動 E
    的頭像 發(fā)表于 10-10 11:40 ?1363次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>啟動 Eureka流程

    Spring Boot的啟動原理

    可能很多初學(xué)者會比較困惑,Spring Boot 是如何做到將應(yīng)用代碼和所有的依賴打包成一個(gè)獨(dú)立的 Jar 包,因?yàn)閭鹘y(tǒng)的 Java 項(xiàng)目打包成 Jar 包之后,需要通過 -classpath 屬性
    的頭像 發(fā)表于 10-13 11:44 ?1103次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的啟動原理

    Spring Boot 的設(shè)計(jì)目標(biāo)

    什么是Spring Boot Spring BootSpring 開源組織下的一個(gè)子項(xiàng)目,也是 S
    的頭像 發(fā)表于 10-13 14:56 ?952次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計(jì)目標(biāo)