摘要:但是考慮到各不相同,所以出現(xiàn)了等日志框架。日志框架只是統(tǒng)一的,其底層的具體的日志記錄工作還是由等承擔(dān)。如何選擇和搭配日志系統(tǒng)目前來說,新應(yīng)用使用是首選,一些老系統(tǒng)中很可能使用的是等。所以若日志沖突時(shí),使用的三方庫只需要相應(yīng)的實(shí)現(xiàn)庫即可。
日志系統(tǒng)的發(fā)展
我們?nèi)粘=佑|到的日志系統(tǒng)有很多種,log4j,JUL(jdk自帶),logback等,我們可以直接根據(jù)對(duì)象的日志API進(jìn)行使用。但是考慮到API各不相同,所以出現(xiàn)了JCL(Jakarta Commons Logging)、slf4j等日志API框架。日志API框架只是統(tǒng)一的API,其底層的具體的日志記錄工作還是由log4j、JUL、logback等承擔(dān)。
如何選擇和搭配日志系統(tǒng)目前來說,新應(yīng)用使用logback是首選,一些老系統(tǒng)中很可能使用的是log4j等。目前slf4j對(duì)logback和log4j都支持,對(duì)JCL也提供了橋接方法,將JCL的api轉(zhuǎn)化slf4j的API。貼一張Webx中的圖足以說明一切
由于存在JCL,SLF4j兩大日志框架,logback、log4j、JUL日志系統(tǒng)所以理論上有這么多種日志系統(tǒng)的搭配。
JUL
log4j
logback
jcl+log4j
slf4j+slf4j-log4j12+log4j
slf4j+logback
jcl-over-slf4j+slf4j+logback
jcl-over-slf4j+slf4j+slf4j-log4j12+log4j
其中slf4j+slf4j-log4j12+log4j、slf4j+logback是主流,推薦使用。
常見的日志包以及輔助包功能介紹 JCL(commons-logging)系列commons-logging apache logging抽象日志工具,一般搭配log4j1/2使用
spring-jcl Spring自己的commons-logging同名類日志,Spring內(nèi)部的日志調(diào)用的都是commons-logging包,優(yōu)先選擇Logj
jcl-over-slf4j slf4j提供的commons-logging同名日志類,通過同名類的方式替換實(shí)現(xiàn)方式為slf4j
SLF4j系列slf4j-api Slf4j提供的日志抽象接口,不包含實(shí)現(xiàn),具體使用何種日志實(shí)現(xiàn)需要引入對(duì)應(yīng)的實(shí)現(xiàn)包
slf4j-jdk14 Slfj的jdk日志實(shí)現(xiàn)包
slf4j-log4j12 Slf4j的log4j1/2實(shí)現(xiàn)包
JUL系列jul-to-slf4j Slf4j提供的jul實(shí)現(xiàn)包,通過jul提供的擴(kuò)展接口,定制slf4j的實(shí)現(xiàn)
log4j系列log4j log4j v1版本的包
log4j-api log4j v2版本的包
log4j-over-slf4j Slf4j提供的log4j v1版本的同名日志類,通過同名類的方式替換實(shí)現(xiàn)方式為slf4j
log4j-to-slf4j log4j v2通過spi機(jī)制提供的轉(zhuǎn)換至slf4j的實(shí)現(xiàn)
多種日志工具共存時(shí)的解決方案當(dāng)依賴了一些三方庫時(shí),可能會(huì)出現(xiàn)多種日志共存的問題,無法保證每種日志抽象庫都使用一樣的實(shí)現(xiàn)類,此時(shí)需要制定固定的日志庫。
主流的日志庫都提供了擴(kuò)展方式
通過LogManager.getLogManager().getLogger("").addHandler()方法,可以添加日志具體實(shí)現(xiàn)
LogManager.getLogManager().getLogger("").addHandler(new SLF4JBridgeHandler());
繼承java.util.logging.Handler 類,在實(shí)現(xiàn)中使用具體的Logger庫即可
實(shí)現(xiàn)例子:
jul-to-slf4j(https://www.slf4j.org/api/org...)
通過指定環(huán)境變量LogFactory,org.apache.commons.logging.LogFactory
System.setProperty("org.apache.commons.logging.LogFactory","com.answern.claimv2.framework.log.LogFactoryImplAdapter");
繼承org.apache.commons.logging.LogFactory類,實(shí)現(xiàn)自己的LogFactory即可
還可以通過jcl提供的spi機(jī)制,實(shí)現(xiàn)自己的org.apache.commons.logging.LogFactory
創(chuàng)建META-INF/services/org.apache.commons.logging.LogFactory文件,文件內(nèi)定義LogFactory的完整類名即可。
還有另外一種暴力的方式:
不引入commons-logging包,而是創(chuàng)建jcl的一些同名類,在實(shí)現(xiàn)中直接使用具體的日志庫。jcl-over-slf4j(https://mvnrepository.com/art...)就是一個(gè)典型的例子.
相同功能的還有spring-jcl(https://mvnrepository.com/art...)
log4j提供了java對(duì)原生spi機(jī)制的支持
建立MEATA-INF/services/org.apache.logging.log4j.spi.Provider文件
繼承org.apache.logging.log4j.spi.Provider類,實(shí)現(xiàn)自己的LoggerContextFactory即可
實(shí)現(xiàn)例子:
log4j-to-slf4j(https://logging.apache.org/lo...)
slf4j官方介紹了使用方式,通過引入不同的jar包來使用具體的日志庫。
由于slf4j拆分做的很好,當(dāng)多種日志庫共存時(shí),若不引入slf4j-xxx.jar時(shí),不會(huì)加載相應(yīng)的日志庫。
所以若日志沖突時(shí),使用slf4j的三方庫只需要include/exclude相應(yīng)的實(shí)現(xiàn)庫即可。
由于日志庫多種多樣,如果盲目引入jcl或者slf4j時(shí),可能會(huì)對(duì)具體使用的項(xiàng)目造成影響。所以最合適的方式是內(nèi)嵌一套日志抽象,內(nèi)部動(dòng)態(tài)的去選擇加載哪個(gè)日志庫。主流的成熟框架都會(huì)這么做,盡可能的保持兼容性。
例如spring/mybatis/freemarker/dubbo這些框架,都有一套內(nèi)嵌的日志抽象,打印日志時(shí)只需要調(diào)用內(nèi)嵌的日志即可做到全兼容。
參考https://www.jianshu.com/p/54c...
https://www.slf4j.org/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/73415.html
摘要:所以借鑒大家慣用的傳統(tǒng)運(yùn)維思路,并配有一個(gè)與以前傳統(tǒng)對(duì)接的點(diǎn),廣發(fā)銀行有如下幾個(gè)做法第一,操作系統(tǒng)。所以廣發(fā)使用了一個(gè)配置文件包。版本流程這是廣發(fā)銀行持續(xù)集總的框架。 數(shù)人云上海&深圳兩地容器之Mesos/K8S/Swarm三國演義的嘉賓精彩實(shí)錄第一彈來啦。今天是廣發(fā)銀行數(shù)據(jù)中心的運(yùn)維老兵沈偉康關(guān)于傳統(tǒng)運(yùn)維與容器適配的全方位分享,萬字長文傾情奉上~ 沈偉康,廣發(fā)銀行數(shù)據(jù)中心 運(yùn)維中年人...
摘要:如果日志沒有馬上顯示,使用來重啟服務(wù)。出現(xiàn)問題一定要看日志與訪問時(shí),訪問附件等于附件 隨著項(xiàng)目的跟近,與nginx打的交道越來越多,現(xiàn)將遇到的問題記錄如下: 相對(duì)路徑 在進(jìn)行路徑定義時(shí),是否可以使用相對(duì)路徑? NO 絕對(duì)不能夠使用相對(duì)路徑 日志 # 根級(jí)別 error_log /var/logs/error.log warn; http { log_format main...
摘要:前言面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開來,那么這就是你的優(yōu)勢(shì),本系列將講述一些面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 前言 面試中對(duì)于技術(shù)職位,一般分筆試與面談,如果面試官的一些小問題你可以立馬找到對(duì)應(yīng)的知識(shí)點(diǎn)擴(kuò)展開來,那么這就是你的優(yōu)勢(shì),本系列將講述一些java面試中的事,不會(huì)很詳細(xì),但是應(yīng)該比較全面吧。 主要內(nèi)容 說到...
摘要:容易導(dǎo)致內(nèi)存泄漏。如果我們的強(qiáng)引用不存在的話,那么就會(huì)被回收,也就是會(huì)出現(xiàn)我們沒被回收,被回收,導(dǎo)致永遠(yuǎn)存在,出現(xiàn)內(nèi)存泄漏。緩存行和一次定位,不會(huì)有沖突由于使用數(shù)組,不會(huì)出現(xiàn)回收,沒被回收的尷尬局面,所以避免了內(nèi)存泄漏。 1 背景 某一天在某一個(gè)群里面的某個(gè)群友突然提出了一個(gè)問題:threadlocal的key是虛引用,那么在threadlocal.get()的時(shí)候,發(fā)生GC之后,ke...
摘要:老夫的老夫的主頁謝謝閱讀那點(diǎn)事訪問級(jí)別修飾符注本文討論的所有情況沒有考慮嵌套類。這種訪問級(jí)別是范圍最大的,當(dāng)泥萌使用該修飾符修飾類的成員的時(shí)候,代表該成員可以被所有類訪問,即整個(gè)項(xiàng)目下都是可以訪問的。 老夫的gayhub老夫的主頁謝謝閱讀 Java那點(diǎn)事-訪問級(jí)別修飾符 注:本文討論的所有情況沒有考慮嵌套類。 Java的訪問級(jí)別修飾符(Access Level Modifiers)有四...
閱讀 2557·2023-04-25 20:05
閱讀 2886·2023-04-25 17:56
閱讀 2195·2021-10-14 09:49
閱讀 2681·2019-08-29 15:10
閱讀 2922·2019-08-29 12:25
閱讀 416·2019-08-28 18:23
閱讀 757·2019-08-26 13:26
閱讀 1370·2019-08-23 18:21