1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        圖解Java日志體系

        共 2992字,需瀏覽 6分鐘

         ·

        2021-03-09 09:02

        點擊上方 好好學java ,選擇 星標 公眾號

        重磅資訊,干貨,第一時間送達

        今日推薦:14 個 github 項目!

        個人原創(chuàng)100W +訪問量博客:點擊前往,查看更多

        來源:albenw.github.io/posts/854fc091/

        概要

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

        Log日志體系

        在日常工作中我們可能看到項目中依賴的跟日志相關的jar包有很多,commons-logging.jar、log4j.jar、sl4j-api.jar、logback.jar等等,眼花繚亂。我們要正確的配置,使得jar包相互作用生效之前,就先要理清它們之間的關系。

        背景/發(fā)展史

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

        1. log4j(作者Ceki Gülcü)出來時就等到了廣泛的應用(注意這里是直接使用),是Java日志事實上的標準,并成為了Apache的項目

        2. Apache要求把log4j并入到JDK,SUN拒絕,并在jdk1.4版本后增加了JULjava.util.logging

        3. 畢竟是JDK自帶的,JUL也有很多人用。同時還有其他日志組件,如SimpleLog等。這時如果有人想換成其他日志組件,如log4j換成JUL,因為api完全不同,就需要改動代碼。

        4. Apache見此,開發(fā)了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的實現。很好的設計原則嘛,依賴抽象而非實現。這樣應用程序可以在運行時選擇自己想要的日志實現組件。

        5. 這樣看上去也挺美好的,但是log4j的作者覺得JCL不好用,自己開發(fā)出slf4j,它跟JCL類似,本身不替供日志具體實現,只對外提供接口或門面。目的就是為了替代JCL。同時,還開發(fā)出logback,一個比log4j擁有更高性能的組件,目的是為了替代log4j。

        6. Apache參考了logback,并做了一系列優(yōu)化,推出了log4j2

        關系/依賴

        大概了解心路歷程后,再詳細看看它們之間的關系、依賴。

        JCL

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


        JCL支持日志組件不多,不過也有很人用的,例如Spring


        現在用的也越來越少了,也不多講了

        SLF4J

        因為當時Java的日志組件比較混亂繁雜,Ceki Gülcü推出slf4j后,也相應為行業(yè)中各個主流日志組件推出了slf4j的適配


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

        • 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無日志實現
          slf4j-api.jar + slf4j-nop.jar

        SLF4J的適配

        slf4j支持各種適配,無論你現在是用哪種日志組件,你都可以通過slf4j的適配器來使用上slf4j。

        只要你切換到了slf4j,那么再通過slf4j用上實現組件,即上面說的。


        其實總的來說,無論就是以下幾種情況

        • 你在用JCL
          使用jcl-over-slf4j.jar適配

        • 你在用log4j
          使用log4j-over-slf4j.jar適配

        • 你在用JUL
          使用jul-to-slf4j.jar適配


        我在網上盜一張圖,給大家一個整體的依賴圖(懶得畫了)


        讓Spring統(tǒng)一輸出

        這就是為了對slf4j的適配做一個例子說明。

        Spring是用JCL作為日志門面的,那我們的應用是slf4j + logback,怎么讓Spring也用到logback作為日志輸出呢?這樣的好處就是我們可以統(tǒng)一項目內的其他模塊、框架的日志輸出(日志格式,日志文件,存放路徑等,以及其他slf4j支持的功能)
        很簡單,就是加入jcl-over-slf4j.jar就好了。

        我又盜了一個圖來說明


        適配思路

        其實很簡單

        1. 你首先確認需要統(tǒng)一日志的模塊、框架是使用哪個日志組件的,然后再找到sfl4j的適配器。

        2. 記得去掉無用的日志實現組件,只保留你要用的。

        常見問題

        slf4j的日志加載會在程序啟動時把日志打出來,所以一定要注意,它會說明加載是否成功,加載了那個日志實現。

        slf4j已經對錯誤作了說明:

        http://www.slf4j.org/codes.html

        下面講一下可能經常遇到的問題

        Failed to load class org.slf4j.impl.StaticLoggerBinder

        沒找到日志實現,如果你覺得你已經寫上了對應的日志實現依賴了,那你要檢查一下了,一般來說極有可能是版本不兼容。

        Multiple bindings

        找到多個日志實現,slf4j會找其中一個作為日志實現。

        代碼規(guī)范

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

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

        總結

        文章幫大家梳理了Java日志組件的關系,以及如何解決日常中常見日志相關的問題,希望對大家?guī)椭?/p>

        推薦文章
        更多項目源碼

        瀏覽 62
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人视频高清无码在线观看 | 国产亚洲精品美女久久久 | 久久久久亚洲精品男人的天堂 | 男女a级片 | 婷婷伊人| 青青人亚洲AV永久无码精品无 | 黄色香蕉视频在线观看 | 无毛嫩逼一级片网 | 好紧好爽好舒服 | 新加坡毛片|