編程小知識(shí)【java-0010】java常用開(kāi)發(fā)庫(kù)-日志庫(kù)
日志系統(tǒng)和日志門(mén)面。
日志庫(kù)的使用, 包含配置與API使用;配置側(cè)重于日志系統(tǒng)的配置,API使用側(cè)重于日志門(mén)面。
日志系統(tǒng)
日志系統(tǒng)指的是具體的日志框架,這里我們只說(shuō)一下最常用的log4j2、logback,而JUL、log4j現(xiàn)階段基本不常見(jiàn)了。
Log4j2
Log4j2是Log4j 的升級(jí)版,Log4j2 和 Log4j1.x 并不兼容,設(shè)計(jì)上很大程度上模仿了 SLF4J/Logback,性能上也獲得了很大的提升。Log4j2 也做了 Facade/Implementation 分離的設(shè)計(jì),分成了 log4j-api 和 log4j-core。
Logback
Logback 是springBoot默認(rèn)的日志處理框架,同時(shí)它和log4j都是出自同一作者之手,提供了性能更好的實(shí)現(xiàn),異步 logger,F(xiàn)ilter等更多的特性。
logback 當(dāng)前分成三個(gè)模塊:logback-core、logback-classic 和 logback-access。
logback-core - 是其它兩個(gè)模塊的基礎(chǔ)模塊。
logback-classic - 是 log4j 的一個(gè) 改良版本。此外 logback-classic 完整實(shí)現(xiàn) SLF4J API 使你可以很方便地更換成其它日志系統(tǒng)如 log4j 或 JDK14 Logging。
logback-access - 訪問(wèn)模塊與 Servlet 容器集成提供通過(guò) Http 來(lái)訪問(wèn)日志的功能。
Logback vs Log4j2
log4j2比logback更新:log4j2的GA版在2014年底才推出,比logback晚了好幾年,這期間log4j2確實(shí)吸收了slf4j和logback的一些優(yōu)點(diǎn)(比如日志模板),同時(shí)應(yīng)用了不少的新技術(shù)。
由于采用了更先進(jìn)的鎖機(jī)制和LMAX Disruptor庫(kù),log4j2的性能優(yōu)于logback,特別是在多線程環(huán)境下和使用異步日志的環(huán)境下。
二者都支持Filter(應(yīng)該說(shuō)是log4j2借鑒了logback的Filter),能夠?qū)崿F(xiàn)靈活的日志記錄規(guī)則(例如僅對(duì)一部分用戶(hù)記錄debug級(jí)別的日志)。
二者都支持對(duì)配置文件的動(dòng)態(tài)更新。
二者都能夠適配slf4j,logback與slf4j的適配應(yīng)該會(huì)更好一些,畢竟省掉了一層適配庫(kù)。
logback能夠自動(dòng)壓縮/刪除舊日志。
logback提供了對(duì)日志的HTTP訪問(wèn)功能。
log4j2實(shí)現(xiàn)了“無(wú)垃圾”和“低垃圾”模式。簡(jiǎn)單地說(shuō),log4j2在記錄日志時(shí),能夠重用對(duì)象(如String等),盡可能避免實(shí)例化新的臨時(shí)對(duì)象,減少因日志記錄產(chǎn)生的垃圾對(duì)象,減少垃圾回收帶來(lái)的性能下降。
log4j2和logback各有長(zhǎng)處,總體來(lái)說(shuō),如果對(duì)性能要求比較高的話,log4j2相對(duì)還是較優(yōu)的選擇。
日志門(mén)面
為什么有了日志系統(tǒng)之后我們直接用不就好了,為什么還要弄一個(gè)日志門(mén)面呢?
這其中做重要的一點(diǎn)就是解耦合,slf4j和Commons-Logging都是提供日志門(mén)面的,用戶(hù)可以選擇第三方的日志組件來(lái)作為具體實(shí)現(xiàn)。提供日志的接口和獲取具體日志對(duì)象的方法。這樣就避免了我們的應(yīng)用和日志方案的直接耦合,如果需要有改動(dòng)日志方案時(shí),我們可以直接修改日志實(shí)現(xiàn)。因?yàn)槿罩鹃T(mén)面一般都兼容大多數(shù)的日志框架。
總結(jié)下日志門(mén)面的作用:
面向接口開(kāi)發(fā),不再依賴(lài)具體的實(shí)現(xiàn)類(lèi),減少代碼的耦合;
項(xiàng)目通過(guò)導(dǎo)入不同的日志實(shí)現(xiàn)類(lèi),可以靈活的切換日志框架;
統(tǒng)一API,方便開(kāi)發(fā)者學(xué)習(xí)和使用;
統(tǒng)一配置便于項(xiàng)目日志的管理。
common-logging
common-logging 的功能是提供日志功能的 API 接口,本身并不提供日志的具體實(shí)現(xiàn)(當(dāng)然,common-logging 內(nèi)部有一個(gè) Simple logger 的簡(jiǎn)單實(shí)現(xiàn),但是功能很弱,直接忽略),而是在運(yùn)行時(shí)動(dòng)態(tài)的綁定日志實(shí)現(xiàn)組件來(lái)工作(如 log4j、java.util.loggin)。
SLF4J
簡(jiǎn)單日志門(mén)面(Simple Logging Facade For Java) SLF4J主要是為了給Java日志訪問(wèn)提供一套標(biāo)準(zhǔn)、規(guī)范的API框架,其主要意義在于提供接口,具體的實(shí)現(xiàn)可以交由其他日志框架,例如log4j和logback等。
對(duì)于一般的Java項(xiàng)目而言,日志框架會(huì)選擇slf4j-api作為門(mén)面,配上具體的實(shí)現(xiàn)框架(log4j、logback等),中間使用橋接器完成橋接。
common-logging vs slf4j
兩者區(qū)別不大,slf4j 一大亮點(diǎn)是提供了更方便的日志記錄方式,common-logging日志輸出內(nèi)容需要拼接字符串,而slf4j 的方式是使用{}作為字符串替換符,實(shí)際項(xiàng)目中基本都會(huì)使用slf4j作為日志門(mén)面。
// common-logging
log.debug("time: " + time + ", name: " + name);
// slf4j
logger.debug("time: {}, name: {} ", time, name);