日志组件的关系梳理:如何正确使用它们

背景 
    由于现在开源框架日益丰富,好多开源框架使用的日志组件不尽相同。为防止日志输出混乱,需统一处理。下图是各个日志框架的关系:


从上图中,我们可以看到4部分。 
接口:将所有日志实现适配到了一起,用统一的接口调用。 
实现:目前主流的日志实现 
旧日志到slf4j的适配器:如果使用了slf4j,但是只想用一种实现,想把log4j的日志体系也从logback输出,这个是很有用的。 
slf4j到实现的适配器:如果想制定slf4j的具体实现,需要这些包。

slf4J与旧日志框架的关系 
slf4j等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库。 
logback-classic(默认的logback实现) 
slf4j-jcl.jar(apache commons logging) 
slf4j-logj12.jar(log4j 1.2.4) 
slf4j-jdk14(java.util.logging) 
将所有使用旧式日志API的第三方类库或旧代码的日志调用转到slfj 
jcl-over-slf4j.jar/jcl104-over-slf4j:apache commons logging 1.1.1/1.0.4,直接替换即可。 
log4j-over-slf4j.jar:log4j,直接替换即可。 
jul-to-slf4j:jdk logging,需要在程序开始时调用SLF4JBridgeHandler.install()来注册listener参考JulOverSlf4jProcessor,可在applicationContext.xml中定义该bean来实现初始化。注意原有的log4j.properites将失效,logback网站上提供转换器,支持从log4j.properties 转换到logback.xml 。 

转移到logback的理由 
    slf4j支持参数化的logger.error("帐号ID:{}不存在", userId);告别了if(logger.isDebugEnable()) 时代。 
    另外logback的整体性能比log4j也较佳,hibernate等项目已经采用了slf4j:"某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LOGBack中需要3纳秒,而在Log4J中则需要30纳秒。 LOGBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。" 

完整日志配置:

<!-- log -->  
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-api</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>jcl-over-slf4j</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>log4j-over-slf4j</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>jul-to-slf4j</artifactId>  
    <version>${org.slf4j-version}</version>  
</dependency>  
<dependency>  
    <groupId>org.jboss.logging</groupId>  
    <artifactId>jboss-logging</artifactId>  
    <version>3.1.4.GA</version>  
</dependency>  

     加了几个重要的实现适配器,log4j-over-slf4j,log4j-over-slf4j,jul-to-slf4j。然后jboss-logging部分也进行了统一的版本控制。同时删除及exclude掉所有log4j,commons-logging的各个版本。适配器和具体日志实现,不能共存,否则适配器不生效。这样的话,我们只有logback配置文件即可,因为log4j的输出已经委托给了slf4j(通过log4j-over-slf4j),而slf4j的默认实现是logback。 

其中JUL需要额外执行一行初始化代码 :
SLF4JBridgeHandler.install();// jul to slf4j 
 

猜你喜欢

转载自wb8206656.iteye.com/blog/2388532