Java日志框架用法及常見問題解決方案
日志定義:
在計(jì)算機(jī)領(lǐng)域,日志文件(logfile)是一個(gè)記錄了發(fā)生在運(yùn)行中的操作系統(tǒng)或其他軟件中的事件的文件,或者記錄了在網(wǎng)絡(luò)聊天軟件的用戶之間發(fā)送的消息。
日志記錄(Logging):是指保存日志的行為。最簡(jiǎn)單的做法是將日志寫入單個(gè)存放日志的文件。
日志級(jí)別優(yōu)先級(jí):
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
日志框架的作用:
①:跟蹤用戶對(duì)系統(tǒng)訪問,記錄了系統(tǒng)行為的時(shí)間、地點(diǎn)、狀態(tài)等相關(guān)信息,能夠幫助我們了解并監(jiān)控系統(tǒng)狀態(tài)
②:進(jìn)行統(tǒng)計(jì)
③:進(jìn)行Debug,在系統(tǒng)產(chǎn)生問題時(shí),能夠幫助我們快速的定位、診斷并解決問題。
在發(fā)生錯(cuò)誤或者接近某種危險(xiǎn)狀態(tài)時(shí)能夠及時(shí)提醒我們處理
常用的日志框架類別簡(jiǎn)介:
Log4j Apache Log4j是一個(gè)基于Java的日志記錄工具。它是由Ceki Gülcü首創(chuàng)的,現(xiàn)在則是Apache軟件基金會(huì)的一個(gè)項(xiàng)目。 Log4j是幾種Java日志框架之一。 Log4j 2 Apache Log4j 2是apache開發(fā)的一款Log4j的升級(jí)產(chǎn)品,Log4j被apache收購(gòu),升級(jí),改為log4j2,框架改動(dòng)很大,只是借用之名。 JCL (Jakarta Commons Logging) Apache基金會(huì)所屬的項(xiàng)目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名為Commons Logging。 Slf4j(Simple Logging Facade for Java) 類似于Commons Logging,是一套簡(jiǎn)易Java日志門面,本身并無日志的實(shí)現(xiàn)。 Logback 一套日志組件的實(shí)現(xiàn)(slf4j陣營(yíng))。 JUL (Java Util Logging),自Java1.4以來的官方日志實(shí)現(xiàn),已被淘汰。 jboss-logging 等。Spring框架內(nèi)部使用的日志框架是 JCL (Jakarta Commons Logging)
Mybatis框架中使用的是 Log4j
Hibernate框架中使用的是 jboss-logging
Springboot底層使用的是 SLF4j + Logback
(Log4j,Logback,SLF4j都是同一個(gè)作者。)
問題引入:
市場(chǎng)上存在非常多的日志框架。每一種日志框架都有自己?jiǎn)为?dú)的API,要使用對(duì)應(yīng)的框架就要使用其對(duì)應(yīng)的API,這就大大的增加應(yīng)用程序代碼對(duì)于日志框架的耦合性。
解決思路:
為了解決上述問題,就在日志框架和應(yīng)用程序之間架設(shè)一個(gè)溝通的橋梁,對(duì)于應(yīng)用程序來說,無論底層的日志框架如何變,都不需要有任何感知。只要門面服務(wù)做的足夠好,隨意換另外一個(gè)日志框架,應(yīng)用程序不需要修改任意一行代碼,就可以直接上線。
在軟件開發(fā)領(lǐng)域有這樣一句話:計(jì)算機(jī)科學(xué)領(lǐng)域的任何問題都可以通過增加一個(gè)間接的中間層來解決。而門面模式就是對(duì)于這句話的典型實(shí)踐。
Logback文檔免費(fèi)。Logback的所有文檔是全面免費(fèi)提供的,不象Log4J那樣只提供部分免費(fèi)文檔而需要用戶去購(gòu)買付費(fèi)文檔。Logback擁有更好的性能。
因?yàn)閟pringboot底層使用的是 SLF4j + Logback,而且平時(shí)開發(fā)中使用頻率最高的也是此組合,所以選擇使用此組合進(jìn)行日志框架的整合。
可能出現(xiàn)的問題:
如果我們直接暴力的排除其他日志框架,可能導(dǎo)致第三方庫(kù)在調(diào)用日志接口時(shí)拋出 ClassNotFound 異常,這里就需要用到中間轉(zhuǎn)換包。
中間轉(zhuǎn)換包說白了就是一種偷天換日的解決方案。比如 log4j-over-slf4j ,即 log4j -> slf4j 的轉(zhuǎn)換包,這個(gè)庫(kù)定義了與 log4j一致的接口(包名、類名、方法簽名均一致),但是接口的實(shí)現(xiàn)卻是對(duì) slf4j 日志接口的包裝,即間接調(diào)用了 slf4j 日志接口,實(shí)現(xiàn)了對(duì)日志的轉(zhuǎn)發(fā)。
解決方案:
①:先排除其他日志包
②:在項(xiàng)目中引入 slf4j 的 轉(zhuǎn)換包
③:在項(xiàng)目中引入 slf4j+logback 依賴+ logback的配置文件
在項(xiàng)目中引入 slf4j的 轉(zhuǎn)換包
<!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j --><dependency><groupId>org.slf4j</groupId><artifactId>log4j-over-slf4j</artifactId><!-- 替換log4j --><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><!-- 替換commons-logging --><version>1.7.25</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId><!-- 替換java.util.logging --><version>1.7.25</version></dependency>
在項(xiàng)目中引入slf4j+logback 依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.6</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.6</version> </dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version> </dependency>
logback.xml配置文件
< ?xml version='1.0' encoding='UTF-8'?><configuration> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern></encoder> </appender> <root level='WARN'><appender-ref ref='STDOUT' /></root><!-- 日志:從低到高;只會(huì)打印指定級(jí)別以后的; additivity表示是否將日志信息反饋給root DEBUG==》INFO===》WARN===》ERRORAdditivity:false ,避免重復(fù)打印日志 --> <!-- 在自己的項(xiàng)目在中設(shè)置打印日志的級(jí)別,開發(fā)時(shí)使用--> <logger name='com.xxx.xxx' level='DEBUG' additivity='false'> <appender-ref ref='STDOUT'/> </logger> </configuration>
參考鏈接:
slf4j官網(wǎng)
slf4j使用手冊(cè)
logback官網(wǎng)
Commons Logging官網(wǎng)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 使用python tkinter開發(fā)一個(gè)爬取B站直播彈幕工具的實(shí)現(xiàn)代碼2. Python 用NumPy創(chuàng)建二維數(shù)組的案例3. ThinkPHP6使用JWT+中間件實(shí)現(xiàn)Token驗(yàn)證實(shí)例詳解4. Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考5. 解決Python中報(bào)錯(cuò)TypeError: must be str, not bytes問題6. 不使用XMLHttpRequest對(duì)象實(shí)現(xiàn)Ajax效果的方法小結(jié)7. python安裝sklearn模塊的方法詳解8. Python如何解決secure_filename對(duì)中文不支持問題9. Python類成員繼承重寫的實(shí)現(xiàn)10. ASP基礎(chǔ)入門第二篇(ASP基礎(chǔ)知識(shí))
