Java日志概述

今天看到了一篇對(duì)Java日志系統(tǒng)講解很不錯(cuò)的文章惯雳,所以做個(gè)學(xué)習(xí)記錄,如有侵權(quán)請(qǐng)聯(lián)系刪除

概述

???????Java的日志系統(tǒng)非常豐富坠陈,常用的有l(wèi)og4j、JUL捐康、logback等等仇矾,隨著日志系統(tǒng)的發(fā)展出現(xiàn)了日志框架commons-logging、slf4j

發(fā)展史

???????日志最早出現(xiàn)的是apache開源社區(qū)的log4j解总,是應(yīng)用最為廣泛的日志工具贮匕,然而sun公司在JDK1.4中增加了JUL日志實(shí)現(xiàn)企圖對(duì)抗log4j,同時(shí)斷斷續(xù)續(xù)也出現(xiàn)了其他的日志工具花枫,這就造成了混亂刻盐,因?yàn)檫@些日志系統(tǒng)互相沒有關(guān)聯(lián),替換和統(tǒng)一變得棘手劳翰,想象一下你的應(yīng)用使用了log4j敦锌,然后使用了其他團(tuán)隊(duì)的庫,而他們使用了JUL佳簸,那么你的應(yīng)用就需要使用兩個(gè)日志系統(tǒng)了乙墙,然后又有第二個(gè)庫使用了simplelog,這個(gè)時(shí)候估計(jì)你就會(huì)崩潰了...那么如何解決呢生均?進(jìn)行抽象听想,抽象出一個(gè)接口層對(duì)每個(gè)日志實(shí)現(xiàn)都適配或者轉(zhuǎn)接,提供給別人的庫都直接使用抽象層而具體的實(shí)現(xiàn)由使用者決定马胧。不錯(cuò)汉买,開源社區(qū)提供了commons-logging抽象,被稱為JCL佩脊,JCL確實(shí)出色的完成了兼容主流的日志實(shí)現(xiàn)(log4j蛙粘、JUL朽色、simplelog),基本一統(tǒng)江湖组题,就連大名鼎鼎的spring也是依賴了JCL葫男。然而好景不長,另一個(gè)優(yōu)秀的日志框架slf4j的出現(xiàn)使場面更加混亂崔列,而slf4j的作者(Ceki Gülcü)正是log4j的作者梢褐,他覺得JCL不夠優(yōu)秀所以要搞一套更優(yōu)雅的出來,于是slf4j誕生了赵讯,同時(shí)為slf4j實(shí)現(xiàn)了一個(gè)親兒子——logback盈咳。
???????slf4j確實(shí)更加優(yōu)雅,但是之前已有很多代碼庫已經(jīng)使用了JCL边翼,雖然出現(xiàn)了slf4j與JCL之間的橋接轉(zhuǎn)換鱼响,但是集成的時(shí)候依然問題多多,到此本來應(yīng)該完了组底,但是Ceki Gülcü覺得還是得回頭拯救下自己的“大阿哥”——log4j丈积,于是log4j2誕生了,同樣log4j2也參與到了slf4j日志體系中债鸡,想必將來會(huì)更加混亂......

JCL

???????使用JCL一般需要配置一個(gè)commons-logging.properties在classpath上江滨,這個(gè)文件有一行代碼:

org.apache.commons.logging.LogFactory= org.apache.commons.logging.impl.LogFactoryImpl

???????這個(gè)是告訴JCL我們要使用哪個(gè)日志實(shí)現(xiàn),JCL會(huì)在classpath下去加載對(duì)應(yīng)的日志工廠實(shí)現(xiàn)類厌均,具體的日志工廠實(shí)現(xiàn)類可以是log4j唬滑,也可以是jul等等。用戶主需要依賴JCL的api即可棺弊,對(duì)日志系統(tǒng)的替換主需要修改一下commons-logging.properties文件切換到對(duì)應(yīng)的日志工廠實(shí)現(xiàn)即可晶密,但是我們也可以看到因?yàn)镴CL是在運(yùn)行時(shí)去加載classpath下的實(shí)現(xiàn)類,會(huì)有classloader的問題模她。

slf4j

???????slf4j的設(shè)計(jì)確實(shí)比較優(yōu)雅稻艰,它采用了我們比較熟悉的方式——接口和實(shí)現(xiàn)分離,有個(gè)純粹的接口層slf4j-api工程缝驳,這個(gè)里面基本完全定義了日志的接口连锯,所以對(duì)于開發(fā)者來說只需要是這個(gè)即可归苍。
???????有接口就要有實(shí)現(xiàn)用狱,比較推崇的實(shí)現(xiàn)是logback,logback完全實(shí)現(xiàn)了slf4j-api的接口拼弃,并且性能是那個(gè)也比log4j更好夏伊,我們知道log4j的使用比較普遍,所以為了支持這部分用戶是必須的吻氧,slf4j-log4j12也實(shí)現(xiàn)了slf4j-api溺忧,這個(gè)算是對(duì)log4j的適配器咏连。同樣的道理,對(duì)JUL的是配置為slf4j-jdk14鲁森。
???????為了讓使用JCL等等其他其他日志系統(tǒng)的用戶可以很簡單的切換到slf4j上來祟滴,給出了各種橋接工程,例如:jcl-over-slf4j會(huì)把JCL的調(diào)用都橋接到slf4j上來(可以看出jcl-over-slf4j的api和JCL是相同的歌溉,所以這兩個(gè)jar是不能共存的)垄懂,jul-to-slf4j是把jul的調(diào)用橋接到slf4j上,log4j-over-slf4j是把log4j的調(diào)用橋接到slf4j痛垛,下面用一張圖來表示下這個(gè)家族的大致成員(紅線表示沖突)


???????如上圖所示草慧,最上層表示橋接層,中間是接口層匙头,最下層表示具體的實(shí)現(xiàn)漫谷,可以看出這個(gè)圖中所有的jar都是圍繞著slf4j活動(dòng)的,其中slf4j-jul的jar包名稱是slf4j-jdk14
???????slf4j-api和具體的實(shí)現(xiàn)層是怎么綁定的呢蹂析?這個(gè)其實(shí)是在編譯時(shí)綁定的舔示,它可以不需要像使用JCL那樣需要配置一下,只需要把slf4j-api和slf4j-log4j放到classpath上电抚,即實(shí)現(xiàn)綁定斩郎。原理可以下載slf4j-api的源碼查看,這個(gè)設(shè)計(jì)還是很巧妙的喻频,slf4j-api中會(huì)去調(diào)用StaticLoggerBinder這個(gè)類獲取綁定的工廠類缩宜,而每個(gè)日志實(shí)現(xiàn)會(huì)在自己的jar中提供這樣一個(gè)類,這樣slf4j-api就實(shí)現(xiàn)了編譯時(shí)綁定實(shí)現(xiàn)甥温。但是這樣接口的源碼編譯需要依賴具體的實(shí)現(xiàn)了锻煌,不太合理吧?這里容易讓人迷惑姻蚓,因?yàn)榇蜷_slf4j-api的jar宋梧,看不到StaticLoggerBinder,當(dāng)我們?nèi)ゲ榭磗lf4j-api的源碼狰挡,在源碼中看到了StaticLoggerBinder這個(gè)類捂龄,猜想應(yīng)該是slf4j-api在打包過程中有動(dòng)作,刪除了自己包中的那個(gè)類加叁,結(jié)果不出所料倦沧,確實(shí)是pom中的ant-task給處理了,pom中處理方式如下:

<plugin>  
        <groupId>org.apache.maven.plugins</groupId>  
        <artifactId>maven-antrun-plugin</artifactId>  
        <executions>  
          <execution>  
            <phase>process-classes</phase>  
            <goals>  
             <goal>run</goal>  
            </goals>  
          </execution>  
        </executions>  
        <configuration>  
          <tasks>  
            <echo>Removing slf4j-api's dummy StaticLoggerBinder and StaticMarkerBinder</echo>  
            <delete dir="target/classes/org/slf4j/impl"/>  
          </tasks>  
        </configuration>  
      </plugin>  

???????打出來的slf4j-api的包是"不完整"的它匕,只有找到包含StaticLoggerBinder這個(gè)類的包才可以展融,于是slf4j-log4j和logback-classic都提供了這個(gè)類。另外豫柬,slf4j-log4j和logback以及slf4j-jdk14是不能同時(shí)和slf4j共存的告希,也就是說只能有一個(gè)實(shí)現(xiàn)存在扑浸,不然啟動(dòng)會(huì)提示有多個(gè)綁定。
???????同時(shí)這個(gè)圖中橋階層和對(duì)應(yīng)的實(shí)現(xiàn)jar是不能共存的燕偶,比如log4j-over-slf4j和slf4j-log4j喝噪,jul-to-slf4j和slf4j-jdk14,這個(gè)很好理解指么,會(huì)有死循環(huán)仙逻,啟動(dòng)也會(huì)報(bào)錯(cuò)。也就是說jar之前有互斥性涧尿。
???????當(dāng)然slf4j也提供了可以把對(duì)slf4j的調(diào)用橋接到JCL上的工程包——slf4j-jcl系奉,可以看出slf4j的設(shè)計(jì)者考慮非常周到,想想這樣的情況:遺留系統(tǒng)使用的是JCL+log4j姑廉,因?yàn)橄到y(tǒng)功能演進(jìn)缺亮,依賴了其他業(yè)務(wù)線的庫,恰好那個(gè)庫依賴了slf4j-api桥言,并且應(yīng)用需要關(guān)心這個(gè)庫的日志萌踱,那么就需要轉(zhuǎn)接日志到JCL上即可。細(xì)心的你可能一經(jīng)發(fā)現(xiàn)号阿,slf4j-jcl和jcl-over-slf4j也是互斥的并鸵,太多互斥的了.......
???????對(duì)于log4j2的加入,也很簡單扔涧,和logback是很相似的园担,如下圖:



紅線依然表示依賴的互斥,當(dāng)然log4j-slf4j-impl也會(huì)和logback-classic枯夜、slf4j-log4j弯汰、slf4j-jdk14互斥。

常見的問題:

  • slf4j-api和實(shí)現(xiàn)版本不對(duì)應(yīng)湖雹,尤其是1.6.x和1.5.x不兼容咏闪,如果沒有特殊需求,直接升級(jí)到最新版本摔吏。

  • slf4j的多個(gè)實(shí)現(xiàn)同時(shí)存在鸽嫂,比如slf4j-log4j和logback-classic,排除其中一個(gè)即可征讲。

  • log4j和logback不能同時(shí)使用据某?可以同時(shí)使用,這兩個(gè)并不矛盾稳诚,遺留系統(tǒng)可能直接使用了log4j的代碼哗脖,并且不能通過log4j-over-slf4j橋接,那么可以讓他繼續(xù)使用log4j扳还,這里(http://www.slf4j.org/legacy.html)有詳細(xì)的介紹才避。

  • 該如何選用這些呢?建議在非特殊情況下氨距,都使用slf4j-api+logback桑逝,不要直接使用日志實(shí)現(xiàn),性能沒什么影響俏让。對(duì)于要提供給別人的類庫楞遏,建議使用slf4j-api,使用方可以自由選擇具體的實(shí)現(xiàn)首昔,并且建議類庫不要依賴具體的日志實(shí)現(xiàn)寡喝。對(duì)于自己的桌面小應(yīng)用,可以直接使用log4j勒奇,畢竟只是隨便做做预鬓。

  • logback因?yàn)槟居衧pring提供的啟動(dòng)listener,所以要自己寫赊颠?可以看看這里(https://github.com/qos-ch/logback-extensions)格二,開源社區(qū)已經(jīng)做好了。

  • 日志系統(tǒng)一般不會(huì)影響到系統(tǒng)性能竣蹦,除非你的系統(tǒng)對(duì)性能非扯ゲ拢苛刻,如果這樣你可以考慮使用Blitz4j(https://github.com/Netflix/blitz4j)痘括,這個(gè)是Netflix(http://netflix.github.io/)社區(qū)對(duì)log4j的性能改進(jìn)版长窄,不過他們依然建議去使用log4j或者logback。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纲菌,一起剝皮案震驚了整個(gè)濱河市抄淑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驰后,老刑警劉巖肆资,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灶芝,居然都是意外死亡郑原,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門夜涕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犯犁,“玉大人,你說我怎么就攤上這事女器∷嵋郏” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涣澡。 經(jīng)常有香客問我贱呐,道長,這世上最難降的妖魔是什么入桂? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任奄薇,我火速辦了婚禮,結(jié)果婚禮上抗愁,老公的妹妹穿的比我還像新娘馁蒂。我一直安慰自己,他們只是感情好蜘腌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布沫屡。 她就那樣靜靜地躺著,像睡著了一般撮珠。 火紅的嫁衣襯著肌膚如雪沮脖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天劫瞳,我揣著相機(jī)與錄音倘潜,去河邊找鬼。 笑死志于,一個(gè)胖子當(dāng)著我的面吹牛涮因,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伺绽,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼违诗,長吁一口氣:“原來是場噩夢啊……” “哼驱负!你這毒婦竟也來了省有?” 一聲冷哼從身側(cè)響起账磺,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杖挣,沒想到半個(gè)月后肩榕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惩妇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年株汉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌殃。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乔妈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓皱,到底是詐尸還是另有隱情路召,我是刑警寧澤勃刨,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站股淡,受9級(jí)特大地震影響身隐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揣非,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一抡医、第九天 我趴在偏房一處隱蔽的房頂上張望躲因。 院中可真熱鬧早敬,春花似錦、人聲如沸大脉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镰矿。三九已至琐驴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秤标,已是汗流浹背绝淡。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苍姜,地道東北人牢酵。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像衙猪,于是被迫代替她去往敵國和親馍乙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 歷史 log4j可以當(dāng)之無愧地說是Java日志框架的元老垫释,1999年發(fā)布首個(gè)版本丝格,2012年發(fā)布最后一個(gè)版本,20...
    kelgon閱讀 10,158評(píng)論 3 53
  • 對(duì)于Java的日志框架棵譬,你也許會(huì)經(jīng)诚则颍看到這些名詞: Log4j、Log4j2 Logback Slf4j JCL ...
    NoahU閱讀 3,953評(píng)論 0 15
  • JAVA日志系統(tǒng)的演變史 我們先看一個(gè)故事订咸。項(xiàng)目經(jīng)理A帶著一幫兄弟開發(fā)了一套復(fù)雜的企業(yè)ERP系統(tǒng)曼尊,這個(gè)系統(tǒng)一連開發(fā)...
    糖寶_閱讀 643評(píng)論 0 4
  • log4j, log4j2, slf4j, logback關(guān)系 log4j是由Apache開發(fā)的一套元老級(jí)日志框架...
    rainybowe閱讀 1,657評(píng)論 0 4
  • 前言 最近學(xué)習(xí)開java web服務(wù)器開發(fā),開始學(xué)習(xí)java算谈,處理業(yè)務(wù)邏輯涩禀,但對(duì)其中的日志比較好奇,之前沒怎么接觸...
    九風(fēng)萍舟閱讀 3,297評(píng)論 1 6