如何在項目中配置正確的日志系統(Maven)


在Maven中使用日志系統

  • 由於JCL-over-SLF4J和原來的JCL具有完全相同的API,因此兩者是不能共存的。

  • Logback和slf4j-log4j12也不能並存,否則SLF4J會迷惑並產生不確定的結果

組裝完整的日志系統將涉及如下部件:

日志系統的組成

類別 組件名稱 說明
日志框架 SLF4J

Webx框架以及所有新應用,直接依賴於SLF4J。

JCL

Spring框架、許多以前的老應用,都使用JCL來輸出日志。

好在SLF4J提供了一個“橋接”包:JCL-over-SLF4J,它重寫了JCL的API,並將所有日志輸出轉向SLF4J。這樣就避免了兩套日志框架並存的問題。

日志系統 Logback

Webx推薦使用logback來取代log4j。

Logback可直接被SLF4J識別並使用。

Log4j

由於客觀原因,有些系統暫時不能升級到Logback。

好在SLF4J仍然支持Log4j。Log4j需要一個適配器slf4j-log4j12才能被SLF4J識別並使用。

在Maven中配置logback作為日志系統

配置pom.xml以使用logback

 

 1 <dependencies>
 2     <dependency>
 3         <groupId>org.slf4j</groupId>
 4         <artifactId>slf4j-api</artifactId>
 5     </dependency>
 6     <dependency>
 7         <groupId>org.slf4j</groupId>
 8         <artifactId>jcl-over-slf4j</artifactId>
 9     </dependency>
10     <dependency>
11         <groupId>ch.qos.logback</groupId>
12         <artifactId>logback-classic</artifactId>
13     </dependency>
14 </dependencies>
15 
16 <dependencyManagement> 
17     <dependencies>
18         <dependency>
19             <groupId>org.slf4j</groupId>
20             <artifactId>slf4j-api</artifactId>
21             <version>1.7.5</version>
22         </dependency>
23         <dependency>
24             <groupId>org.slf4j</groupId>
25             <artifactId>jcl-over-slf4j</artifactId>
26             <version>1.7.5</version>
27         </dependency>
28         <dependency>
29             <groupId>ch.qos.logback</groupId>
30             <artifactId>logback-classic</artifactId>
31             <version>1.0.13</version>
32             <scope>runtime</scope> 
33         </dependency>
34         <dependency>
35             <groupId>commons-logging</groupId>
36             <artifactId>commons-logging</artifactId>
37             <version>1.1.3</version>
38             <scope>provided</scope> 
39         </dependency>
40     </dependencies>
41 </dependencyManagement>

 把所依賴jar包的版本定義在<dependencyManagement>中,而不是<dependencies>中。因為前者可影響間接依賴,后者只能影響直接依賴。

如果你的項目指定了parent pom,那么建議把<dependencyManagement>放在parent pom中,以便多個子項目共享配置。

將logback日志系統的依賴設定為<scope>runtime</scope>,因為應用程序永遠不需要直接調用日志系統,而是通過SLF4J或JCL這樣的日志框架來調用它們。

由於和jcl-over-slf4j存在沖突,因此JCL(commons-logging)是必須被排除的。由於maven目前缺少這樣一個功能:它不能全局地排除一個jar包依賴,所以建議將commons-logging設置成<scope>provided</scope>,這樣在最終的依賴關系中,將不會包含commons-logging包。

 

 

將commons-logging設置成<scope>provided</scope>可以用來排除commons-logging,然而這樣做有一個缺點 —— 你無法從單元測試中將commons-logging排除。假如這個影響了你的單元測試的話,請使用另一種方案:

另一種排除commons-logging的方法

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>99.0-does-not-exist</version> 
        </dependency>

<version>99.0-does-not-exist</version>”是一個特殊的版本,這個版本的jar包里空無一物。這樣就可以“欺騙”maven使用這個空的jar包來取代commons-logging,達到排除它的目的。

最后,你需要在項目文件夾下面,執行一下命令:“mvn dependency:tree”,確保沒有jar包直接或間接依賴了slf4j-log4j12。如果有的話,你可以用下面的配置來排除掉:

排除間接依賴的slf4j-log4j12

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>yourGroupId</groupId>
            <artifactId>yourArtifactId</artifactId>
            <version>yourVersion</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</dependencyManagement>

事實上,如果有其它的jar包依賴slf4j-log4j12,這本身就是有錯誤的。因為應用不應該直接依賴於這些包中的API —— 它們只應該依賴於日志框架API。任何應用都應該把下列和日志系統相關的依賴(如:slf4j-log4j12、logback-classic)設置成<scope>runtime</scope>的。

 

LOG4J不推薦。

轉載自:http://openwebx.org/docs/Webx3_Guide_Book.html#webx.logging


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM