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的日志输出问题进行了讨论。



来自为知笔记(Wiz)



posted on 2016-04-26 14:01  一尾金鱼  阅读(2836)  评论(0编辑  收藏  举报