在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的方法
最后,你需要在項目文件夾下面,執行一下命令:“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

