<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java日志體系整理,必看權(quán)威總結(jié)

          共 2757字,需瀏覽 6分鐘

           ·

          2021-01-06 10:16


          點(diǎn)擊上方?泥瓦匠 關(guān)注我!

          老家浙江東海邊,靠海吃海,目前經(jīng)營(yíng)一個(gè)小品牌,讓普通人吃到最新鮮的海鮮。有興趣可以點(diǎn)擊了解:《浙里有漁,鮮人一步!》???

          概要

          本文的目的是搞清楚Java中各種日志Log之間是怎么的關(guān)系,如何作用、依賴,好讓我們平時(shí)在工作中如果遇到“日志打不出”或者“日志jar包沖突”等之類的問(wèn)題知道該如何入手解決,以及在各種場(chǎng)景下如何調(diào)整項(xiàng)目中的各個(gè)框架的日志輸出,使得輸出統(tǒng)一。

          Log日志體系

          在日常工作中我們可能看到項(xiàng)目中依賴的跟日志相關(guān)的jar包有很多,commons-logging.jarlog4j.jarsl4j-api.jarlogback.jar等等,眼花繚亂。我們要正確的配置,使得jar包相互作用生效之前,就先要理清它們之間的關(guān)系。

          背景/發(fā)展史

          那就要從Java Log的發(fā)展歷程開(kāi)始說(shuō)起。

          1. log4j(作者Ceki Gülcü)出來(lái)時(shí)就等到了廣泛的應(yīng)用(注意這里是直接使用),是Java日志事實(shí)上的標(biāo)準(zhǔn),并成為了Apache的項(xiàng)目
          2. Apache要求把log4j并入到JDK,SUN拒絕,并在jdk1.4版本后增加了JULjava.util.logging
          3. 畢竟是JDK自帶的,JUL也有很多人用。同時(shí)還有其他日志組件,如SimpleLog等。這時(shí)如果有人想換成其他日志組件,如log4j換成JUL,因?yàn)閍pi完全不同,就需要改動(dòng)代碼。
          4. Apache見(jiàn)此,開(kāi)發(fā)了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的實(shí)現(xiàn)。很好的設(shè)計(jì)原則嘛,依賴抽象而非實(shí)現(xiàn)。這樣應(yīng)用程序可以在運(yùn)行時(shí)選擇自己想要的日志實(shí)現(xiàn)組件。
          5. 這樣看上去也挺美好的,但是log4j的作者覺(jué)得JCL不好用,自己開(kāi)發(fā)出slf4j,它跟JCL類似,本身不替供日志具體實(shí)現(xiàn),只對(duì)外提供接口或門面。目的就是為了替代JCL。同時(shí),還開(kāi)發(fā)出logback,一個(gè)比log4j擁有更高性能的組件,目的是為了替代log4j。
          6. Apache參考了logback,并做了一系列優(yōu)化,推出了log4j2

          關(guān)系/依賴

          大概了解心路歷程后,再詳細(xì)看看它們之間的關(guān)系、依賴。

          JCL

          commons-logging已經(jīng)停止更新,最后的狀態(tài)如下所示:

          JCL支持日志組件不多,不過(guò)也有很人用的,例如Spring 現(xiàn)在用的也越來(lái)越少了,也不多講了

          SLF4J

          因?yàn)楫?dāng)時(shí)Java的日志組件比較混亂繁雜,Ceki Gülcü推出slf4j后,也相應(yīng)為行業(yè)中各個(gè)主流日志組件推出了slf4j的適配 圖來(lái)源于官方文檔(https://www.slf4j.org/manual.html)

          圖的意思為如果你想用slf4j作為日志門面的話,你如何去配合使用其他日志實(shí)現(xiàn)組件,這里說(shuō)明一下(注意jar包名缺少了版本號(hào),在找版本時(shí)也要注意版本之間是否兼容)

          • slf4j + logback?slf4j-api.jar?+?logback-classic.jar?+?logback-core.jar
          • slf4j + log4j?slf4j-api.jar?+?slf4j-log4j12.jar?+?log4j.jar
          • slf4j + jul?slf4j-api.jar?+?slf4j-jdk14.jar
          • 也可以只用slf4j無(wú)日志實(shí)現(xiàn)?slf4j-api.jar?+?slf4j-nop.jar

          SLF4J的適配

          slf4j支持各種適配,無(wú)論你現(xiàn)在是用哪種日志組件,你都可以通過(guò)slf4j的適配器來(lái)使用上slf4j。只要你切換到了slf4j,那么再通過(guò)slf4j用上實(shí)現(xiàn)組件,即上面說(shuō)的。圖來(lái)源于官方文檔(https://www.slf4j.org/legacy.html)

          其實(shí)總的來(lái)說(shuō),無(wú)論就是以下幾種情況

          • 你在用JCL 使用jcl-over-slf4j.jar適配
          • 你在用log4j 使用log4j-over-slf4j.jar適配
          • 你在用JUL 使用jul-to-slf4j.jar適配

          我在網(wǎng)上盜一張圖,給大家一個(gè)整體的依賴圖(懶得畫(huà)了)

          讓Spring統(tǒng)一輸出

          這就是為了對(duì)slf4j的適配做一個(gè)例子說(shuō)明。Spring是用JCL作為日志門面的,那我們的應(yīng)用是slf4j + logback,怎么讓Spring也用到logback作為日志輸出呢?這樣的好處就是我們可以統(tǒng)一項(xiàng)目?jī)?nèi)的其他模塊、框架的日志輸出(日志格式,日志文件,存放路徑等,以及其他slf4j支持的功能) 很簡(jiǎn)單,就是加入jcl-over-slf4j.jar就好了。我又盜了一個(gè)圖來(lái)說(shuō)明

          適配思路

          其實(shí)很簡(jiǎn)單

          1. 你首先確認(rèn)需要統(tǒng)一日志的模塊、框架是使用哪個(gè)日志組件的,然后再找到sfl4j的適配器。
          2. 記得去掉無(wú)用的日志實(shí)現(xiàn)組件,只保留你要用的。

          常見(jiàn)問(wèn)題

          slf4j的日志加載會(huì)在程序啟動(dòng)時(shí)把日志打出來(lái),所以一定要注意,它會(huì)說(shuō)明加載是否成功,加載了那個(gè)日志實(shí)現(xiàn)。slf4j已經(jīng)對(duì)錯(cuò)誤作了說(shuō)明官網(wǎng)說(shuō)明(https://www.slf4j.org/codes.html) 下面講一下可能經(jīng)常遇到的問(wèn)題

          Failed to load class org.slf4j.impl.StaticLoggerBinder

          沒(méi)找到日志實(shí)現(xiàn),如果你覺(jué)得你已經(jīng)寫上了對(duì)應(yīng)的日志實(shí)現(xiàn)依賴了,那你要檢查一下了,一般來(lái)說(shuō)極有可能是版本不兼容。

          Multiple bindings

          找到多個(gè)日志實(shí)現(xiàn),slf4j會(huì)找其中一個(gè)作為日志實(shí)現(xiàn)。

          代碼規(guī)范

          阿里對(duì)此的代碼規(guī)范:

          【強(qiáng)制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的 API,而應(yīng)依賴使用日志框架 SLF4J 中的 API,使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。import org.slf4j.Logger; import org.slf4j.LoggerFactory; private static final Logger logger = LoggerFactory.getLogger(Abc.class);

          總結(jié)

          文章幫大家梳理了Java日志組件的關(guān)系,以及如何解決日常中常見(jiàn)日志相關(guān)的問(wèn)題,希望對(duì)大家?guī)椭?span style="text-align: center;color: rgb(51, 51, 51);font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;">

          老家浙江東海邊,靠海吃海,目前經(jīng)營(yíng)一個(gè)小品牌,讓普通人吃到最新鮮的海鮮。有興趣可以點(diǎn)擊了解:《浙里有漁,鮮人一步!》???

          點(diǎn)擊領(lǐng)取:程序員最新學(xué)習(xí)資料!

          下方二維碼關(guān)注我

          技術(shù)草根堅(jiān)持分享?編程,算法,架構(gòu)

          朋友助力下!點(diǎn)個(gè)在看
          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  韩国一区二区在线黄 | 中国黄色天堂 | 欧美经典怡红院肏肥屄淫荡视频在线观看 | 久久久99精品视频 | 成人偷拍小视频 |