2.3.2 Spring 內部日誌機制(logging)

  • 原文地址日誌模塊html

  • 日誌是spring一個很是重要的依賴,由於:a.它是惟一強制依賴,B.每一個人都但願看到他們使用工具的輸出;c.spring整合大量其餘工具,它們也須要日誌依賴.應用開發者的一個重要目標就是:在整個應用的核心區域能夠對日誌進行統一配置,包括全部額外組件. 因爲有不少日誌框架,曾經使這個目標變得更困難; spring的強制日誌依賴是Jakarta Commons Logging API(JCL).咱們編譯JCL,咱們也使JCL 日誌對其餘繼承了spring框架的類可見.使用相同的日誌類庫對用戶來講很是重要:保持向後兼容性,可使spring的應用集成更加容易.咱們這麼作的目的是爲了讓spring的一個模塊明確依賴commons-logging(JCL的規範實現),並使其餘模塊在編譯期間依賴該模塊; 例如你使用了Maven並好奇你從哪裏獲得commons-logging依賴,它將從spring特別是從叫spring-core的核心模塊得到; 使用commons-logging最便捷的地方是你不須要其餘東西來使你的應用工做.它有一組運行時發現算法,能夠在classpath下明顯的地方查找日誌框架,並使用它認爲合適的那個(或者你能夠告訴它你須要那個).若是沒有發現其餘日誌框架,它就會從JDK中使用那些更漂亮些的日誌(java.util.logging或簡化的JUL).你應該發現你的spring項目能夠在大多數沒有控制檯的環境下運行並日志記錄,並且這很重要;java

    ###不要使用Commons Logging 不幸的是,commons-logging的能夠方便最終用戶的運行期間發現算法是有問題的.若是時間能倒流,咱們能從新開發spring,那就讓咱們從新選一個不一樣的日誌依賴吧.這個首選項能夠是java簡單日誌門面(Simple Logging Facade for Java,SLF4J),它一樣能夠和spring一塊兒運行在其餘工具裏; 這裏有兩種基本的方式拋棄commons-logging: 1.移除(exclude)spring-core模塊的依賴(它是明確須要commons-logging依賴的模塊); 2.將特定須要commons-logging依賴的地方用一個空jar來替換類庫(更多細節能夠在 SLF4J FAQ 中查找);移除commons-logging,將這些添加到你的maven依賴管理區域;算法

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.1.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

若是隻這樣的話項目就會報錯,由於它的classpath如今缺乏JCL API的實現;你能夠提供一個新的日誌 模塊來修復它;spring

使用SLF4J

SLF4J是一個更簡潔的依賴,它比common-logging更高效,由於它使用了運行時綁定來代替後者的運行時發現算法,這樣更好的進行日誌框架整合.這意味着你必需要明確的明白運行時發生了什麼,或對其進行相應的聲明或配置.SLF4J支持許多common logging框架,因此你能夠選擇一個你使用過的,對其綁定後進行配置和管理; SLF4J提供了對許多日誌框架的綁定,包括JCL,同時它也作反向操做:橋接其餘日誌框架和它自己.因此使用spring的SLF4J你須要將commons-logging 依賴替換爲SLF4-JCL橋接.你作完以後,spring的日誌調用將轉化爲SLF4J API,只要你的項目中其餘類庫使用API,而後你就能夠只在一個地方去配置和管理日誌; 一個更通用的選項是將SLF4J橋聯到spring,而後將SLF4J綁定到Log4J中.你須要提供四個依賴(還要移除已存在的commons-logging):有bridge(橋聯),SLF4J API,Log4J框架的綁定,log4j自身的實現.在Maven中可能這麼作apache

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.1.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.5.8</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>

這看起來可能要用不少依賴才能使用一些日誌.雖如此,但它是可選擇的;它在面對類加載器的問題時比普通的common-logging框架作的更好,尤爲是你使用一些嚴格的容器,例如OSGI平臺(如電網的sg-uap).聽說另外一顯著優點是:它們在編譯期間完成了綁定而非運行期; ###使用LogBackapi

對於SLF4J的使用者而言,有一個更通用的選擇,那就是使用Logback logback ,這將使用更少的步驟和更少的依賴.這會去掉其餘的綁定步驟,由於Logback直接實現了SLF4J,這樣你就只須要兩個依賴就能夠了而不是四個(只用jcl-over-slf4j和logback).還有,爲了保持slf4J的版本一致性,你須要從其餘非spring依賴中移除slf4j-api依賴;架構

###使用log4j 許多人使用Log4J做爲日誌框架用來配置和管理.它很是高效並且容易創建;實際上咱們建立和檢測spring時在運行時就使用他(log4J).Spring也爲啓動和配置Log4J提供了一些支持,因此在許多模塊中log4J可做爲編譯期可選擇的依賴; 要想將log4J和默認的JCL依賴(commons-logging)一塊兒使用,你須要將log4J加入到classpath中,並提供一個配置文件(log4j.properties或者log4j.xml在根路徑下).對於maven用戶來講,能夠如此配置聲明:app

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
    </dependency>
</dependencies>

此處爲簡單的log4j.properties文件內容框架

log4j.rootCategory=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n

log4j.category.org.springframework.beans.factory=DEBUG

###運行容器中的原生JCL(Runtime Containers with Native JCL) 許多人在一個提供了JCL實現的容器中運行項目; IBM的Websphere Application Server(WAS)是一個典型;這常常出問題,尚未啥銀彈方案,簡單的移除你項目中的commons-logging在大部分場景是沒有用的 要清楚明白:這個問題無關JCL自己,甚至無關commons-logging;也不是綁定commons-logging到其餘架構(如 log4J)中. 它會失敗是由於咱們使用的是1.1版本,而這些容器中使用的1.0的版本,這樣他們就會改變commons-logging的運行發現算法.spring並無使用JCL API的其餘無用部分,因此沒法破解,然當你的spring或項目嘗試使用其餘日誌時,你就會發現對Log4J的綁定就不起做用了; 在WAS環境下,最簡單的事就是反轉類加載器的層次,這樣咱們就能夠用應用自己來管理JCL依賴,而不是用WAS容器.然該選項不老是打開的,可是公共社區應該還有其的可用方法的建議,並且你的具體操做取決於容器的確切版本和其功能集;maven

相關文章
相關標籤/搜索