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