AMQ學習筆記 - 19. 問題解決 - 控制Atomikos的日志輸出


概述


在使用Atomikos為ActiveMQ提供JTA支持時, Atomikos在控制台打印了繁瑣的日志。這里介紹如何控制 Atomikos日志輸出的粒度。

解決方案


基於以下三個事實:
  1. Atomikos使用slf4j輸出日志
    所以,項目里要提供slf4j-api的相關jar包。
  2. slf4j只是一個抽象層,你還需要綁定到一個實現上
    在這里我們使用log4j,那么我們需要引入下面的jar:
    [1] slf4j-log4j12:適配器的角色,提供slf4j-api到log4j的轉換
    [2] log4j:日志實現
  3. 你可以使用log4j.properties來配置log4j的輸出
    log4j.logger.com.atomikos=WARN
經過上面三個步驟,我們進行了slf4j —> log4j的綁定, Atomikos最終使用log4j輸出日志,我們的log4j配置才有效。

擴展內容


slf4j只是一個抽象層,不是一個真正的日志實現。如果你的日志是基於slf4j api的,那么底層可以切換不同的日志實現。

1.log4j

比如使用log4j的實現,那么你需要引入下述依賴:
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.12</version>
</dependency>
分析依賴關系如下:
1 [INFO] +- org.slf4j:slf4j-log4j12:jar:1.7.12:compile # 適配器,將面向slf4j api的日志輸出切換到log4j的底層實現
2 [INFO] |  +- org.slf4j:slf4j-api:jar:1.7.12:compile # 提供抽象的api
3 [INFO] |  \- log4j:log4j:jar:1.2.17:compile # 提供日志實現

 

我們不需要進行任何配置,會自動進行綁定:slf4j-api —> slf4j-log4j12 —> log4j。這樣,我們面向抽象的slf4j編程,如果有切換日志實現的需要,也很方便。

2.slf4j-simple

除了log4j的實現,slf4j-simple的實現,如果使用這個,你的maven依賴可以是:
1 <dependency>
2     <groupId>org.slf4j</groupId>
3     <artifactId>slf4j-simple</artifactId>
4     <version>1.7.12</version>
5 </dependency>

分析依賴關系:

1 [INFO] +- org.slf4j:slf4j-simple:jar:1.7.12:compile # 提供日志實現
2 [INFO] |  \- org.slf4j:slf4j-api:jar:1.7.12:compile # 提供抽象的api

 

這里沒有適配器了,應該是因為slf4j-simple本就是面向slf4j-api的實現。

3.不要綁定多個實現

使用slf4j-api並提供一個具體的實現,我們稱之為binding。如果系統中有多個綁定(比如同時引入了log4j和slf4j-simple),運行時會自動提示下面的消息:
1 SLF4J: Class path contains multiple SLF4J bindings.
2 SLF4J: Found binding in [jar:file:/C:/Users/lijinlong/.m2/repository/org/slf4j/slf4j-log4j12/1.7.12/slf4j-log4j12-1.7.12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
3 SLF4J: Found binding in [jar:file:/C:/Users/lijinlong/.m2/repository/org/slf4j/slf4j-simple/1.7.12/slf4j-simple-1.7.12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
4 SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
5 SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

 

你可以選擇某一個實現進行綁定,但盡量使用一種實現。

參考目錄


  1. 為什么要使用SLF4J而不是Log4J
    理解slf4j和log4j的關系。
  2. How to set Atomikos to not write to console logs
    這里就如何控制Atomikos的日志輸出問題進行了討論。
  3. Unable to setup Slf4j-->Log4J logging in ATE-3.8.0
    這里就如何控制Atomikos的日志輸出問題進行了討論。






免責聲明!

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



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