国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

log4j,log4j2,slf4j,common-logging,jdk-logging集成以及切換

2019-11-08 18:30:34
字體:
來源:轉載
供稿:網友

1.各種jar包解釋

log4j:log4j1的全部內容

log4j2:

log4j-api :log4j2 定義下的apilog4j-core:log4j2 對定義的實現logback:logback-core:logback核心包logback-classic:logback實現了slf4j的apicommons-logging:commons-logging:原生的全部內容log4j-jcl:commons-logging到log4j2的橋梁jcl-over-log4j:commons-logging到slf4j的橋梁slf4j轉向某個實際的日志框架:

場景介紹:如 使用slf4j的API進行編程,底層想使用log4j1來進行實際的日志輸出,這就是slf4j-log4j12干的事。

slf4j-jdk14:slf4j到jdk-logging的橋梁slf4j-log4j12:slf4j到log4j1的橋梁log4j-slf4j-impl:slf4j到log4j2的橋梁logback-classic:slf4j到logback的橋梁slf4j-jcl:slf4j到commons-logging的橋梁某個實際的日志框架轉向slf4j:

場景介紹:如 使用log4j1的API進行編程,但是想最終通過logback來進行輸出,所以就需要先將log4j1的日志輸出轉交給slf4j來輸出,slf4j 再交給logback來輸出。將log4j1的輸出轉給slf4j,這就是log4j-over-slf4j做的事

這一部分主要用來進行實際的日志框架之間的切換(下文會詳細講解)

jul-to-slf4j:jdk-logging到slf4j的橋梁log4j-over-slf4j:log4j1到slf4j的橋梁jcl-over-slf4j:commons-logging到slf4j的橋梁

備注:鏈接:官方各個jar包說明http://logging.apache.org/log4j/2.x/runtime-dependencies.html jcl全稱:Jakarta Commons Logging jul全稱:java Logging Framework

2.slf4j與其他日志框架的集成

slf4j與jdk-logging集成:slf4j-api, slf4j-jdk14(集成包)slf4j與log4j1集成:slf4j-api,log4j, slf4j-jdk14(集成包)slf4j與log4j2集成:slf4j-api, log4j-api, log4j-core, log4j-slf4j-impl(集成包)slf4j與logback集成:slf4j-api,logback-core,logback-classic(集成包)slf4j與commons-logging集成:slf4j-api,commons-logging,slf4j-jcl(集成包)

3.日志系統之間的切換

log4j1切換到logback

示例:import org.apache.log4j.Logger;...PRivate static final Logger logger=Logger.getLogger(JulSlf4jLog4jTest.class.getName());

操作步驟: - 去掉log4j包 - 添加log4j-over-slf4j(橋梁),slf4j-api,logback-core,logback-classic - 添加logback的配置文件

實現原理:log4j-over-slf4j內部是簡化版的log4j(定義與log4j中基本一致,可實現無縫遷移),真正實現的時候使用slf4j-api里面的來具體實現,slf4j會自動適配真正使用哪種來實現,舉一反三,slf4j向哪種日志輸出可以自由搭配

jdk-logging到logback

示例:import java.util.logging.Logger;...private static final Logger logger=Logger.getLogger(JulSlf4jLog4jTest.class.getName());

操作步驟: - 添加jar包:jul-to-slf4j (實現jdk-logging切換到slf4j),slf4j-api,logback-core,logback-classic - 添加logback配置文件 - 在代碼中添加如下代碼 static { SLF4JBridgeHandler.install(); }

實現原理:在jul-to-slf4j里面只有1個類:SLF4JBridgeHandler,這個類集成了jdk-logging里面的java.util.logging.Handler,這個是jdk-logging處理日志中的一個處理器,在使用之前,必須提前注冊這個處理器,具體沒細研究過,初始化后這個類后slf4j的原生LoggerFactory會獲取一個定義的logger來進行日志的輸出

commons-logging切換到logback

private static Log logger=LogFactory.getLog(JulJclTest.class);public static void main(String[] args){ if(logger.isTraceEnabled()){ logger.trace("commons-logging-jcl trace message"); }}

操作步驟: - 去掉commons-logging.jar(無所謂) - 添加:jcl-over-slf4j(實現commons-logging切換到slf4j),slf4j-api,logback-core,logback-classic - 添加logback配置文件

實現原理:commons-logging通過jcl-over-slf4j 來選擇slf4j作為底層的日志輸出對象,而slf4j又選擇logback來作為底層的日志輸出對象

混合日志切換1

項目中目前使用commons-logging,log4j1,jdk-logging 現在想統一將日志的輸出交給logback 操作步驟: - 將上述日志輸出全部切換到slf4j - - 去掉commons-logging(其實去不去都可以),使用jcl-over-slf4j將commons-logging的底層日志輸出切換到slf4j - - 去掉log4j1(必須去掉),使用log4j-over-slf4j,將log4j1的日志輸出切換到slf4j - - 使用jul-to-slf4j,將jul的日志輸出切換到slf4j - 使slf4j選擇logback來作為底層日志輸出 - - 添加slf4j-api,logback-core,logback-classic - 添加logback配置文件

混合日志切換2

項目中目前使用commons-logging,log4j進行編程現在統一切換到jdk-logging 操作步驟: - 切換到slf4j來輸出 - - 去掉commons-logging(是否去掉無影響),使用jcl-over-slf4j將commons-logging底層實現切換到slf4j - - 去掉log4j1(必須去),使用log4j-over-slf4j,將log4j1的實現切換到slf4j - 選擇真正的實現 - - 添加slf4j-api,slf4j-jdk14(集成包)

4.沖突說明

參考slf4j官網的沖突說明http://www.slf4j.org/legacy.html

jcl-over-log4j與slf4j-jcl沖突

jcl-over-log4j:commons-logging切換到slf4jslf4j-jcl : slf4j切換到commons-logging 兩者共存,造成實現類相互委托,內存溢出

log4j-over-slf4j 與 slf4j-log4j12 沖突

log4j-over-slf4j : log4j1切換到slf4jslf4j-log4j12 : slf4j切換到log4j1 原理同上,但是log4j-over-slf4內部做了一個判斷,可以防止造成內存溢出

jul-to-slf4j 與 slf4j-jdk14 沖突

jul-to-slf4j : jdk-logging切換到slf4jslf4j-jdk14 : slf4j切換到jdk-logging 沖突同樣是內存溢出

總結區別比較

內部實現原理這里不再細說,可參考文章:http://blog.csdn.net/a283398689/article/details/52776145

commons-logging和slf4j

都是日志接口,但common-logging通過動態查找的機制,在程序運行時自動找出真正使用的日志庫。由于它使用了ClassLoader尋找和載入底層的日志庫, 導致了象OSGI這樣的框架無法正常工作,因為OSGI的不同的插件使用自己的ClassLoader。 OSGI的這種機制保證了插件互相獨立,然而卻使Apache Common-Logging無法工作。slf4j在編譯時靜態綁定真正的Log庫,因此可以再OSGI中使用。另外,SLF4J 支持參數化的log字符串,避免了之前為了減少字符串拼接的性能損耗而不得不寫的if(logger.isDebugEnable()),現在你可以直接寫:logger.debug(“current user is: {}”, user)。拼裝消息被推遲到了它能夠確定是不是要顯示這條消息的時候,但是獲取參數的代價并沒有幸免。

性能比較

log4j2 >= slf4j >log4j1,具體性能如何,我沒自己測試,有興趣可以試試

實際操作

新寫的接口盡可能用slf4j的api編寫,從上面可以看到slf4j基本接了所有的實現,以后切換也比較方便項目開發過程中,發現log4j1的依賴比較多,這個基本上去除不干凈,稍微不注意就使用成了log4j1的api,導致日志打印不出來,這里再次區分log4j1:import org.apache.log4j.Logger;log4j2:import org.apache.logging.log4j.Logger;
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大港区| 湘阴县| 张家界市| 株洲市| 洪江市| 灵石县| 泗水县| 松原市| 苏尼特右旗| 汪清县| 祁门县| 西平县| 汕头市| 武夷山市| 长海县| 新巴尔虎左旗| 万盛区| 赤水市| 来宾市| 磐石市| 唐山市| 西安市| 蓝田县| 定襄县| 京山县| 黄平县| 社会| 长海县| 乌海市| 肇州县| 景谷| 彭阳县| 洛隆县| 方城县| 塔城市| 尉氏县| 邛崃市| 巴楚县| 渝中区| 榆中县| 八宿县|