常用日志框架

来源:互联网 发布:企业站源码 编辑:程序博客网 时间:2024/06/14 11:47

1. 简述

现在开源框架日益丰富,经常存在着在一个项目中,不同的版本,不同的框架共存。导致日志输出异常混乱

其中有一些标准通用接口,标准实现,各种桥接器的存在

接口:将所有日志实现适配到了一起,用统一的接口调用。 

实现:目前主流的日志实现 

桥接适配:用于将slf4j和commons-logging连接;slf4j和log4j连接。。。。。。

slf4j接口主要有Logger、LoggerFactory;

commons-logging接口主要有Log、LogFactory;

第一步都是获得factory,第二步通过factory获得log;

jcl即为jakarta commons-logging;

2. 常用日志框架组合

2.1 commons-logging+log4j

经典的一个日志实现方案。出现在各种框架里。如spring、ibatis等等。直接使用log4j即可满足我们的日志方案。但是一般为了避免直接依赖具体的日志实现,一般都是结合commons-logging来实现。常见代码如下:

import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;private static Log logger = LogFactory.getLog(CommonsLoggingTest.class);

2.2 Commons-logging+log4j+slf4j

如果在原有commons-logging系统里,要迁移到slf4j,也是可以做到的。原理使用到了上述commons-logging加载的第二点。需要引入jcl-over-slf4j-1.5.6.jar。这个jar包提供了一个桥接,让底层实现是基于slf4j。原理是在该jar包里存放了配置

METAINF/services/org.apache.commons.logging.LogFactory=

org.apache.commons.logging.impl.SLF4JLogFactory,而commons-logging在初始化的时候会找到这个serviceId并把它作为LogFactory。

slf4j再装载具体日志实现类。

2.3 我们的日志组合方式

目前依赖的是c3p0:c3p0:0.9.1.2,默认优先使用log4j,其次使用c3p0自带实现;无法直接适配到slf4j;

2.4 注意点

假如在 CLASS_PATH 里同时放置 log4j-over-slf4j.jar和 slf4j-log4j12-version.jar ,日志会被踢来踢去,最终进入死循环。

3. commons-logging简介

3.1 LogFactory实例化:

通过加载不同的LogFactory可以适配到不同的日志框架中

1)查询org.apache.commons.logging.LogFactory属性设置

 

2) 查询classpath下的 META-INF/services/org.apache.commons.logging.LogFactory文件

 

3) 查询classpath下的commons-logging.propertites,如果找到则按其中的配置加载

 

 

4) 加载默认实现LogFactoryImpl

 

3.2 Log实例化:

加载默认实现LogFactoryImpl后,通过加载不同的Log可以适配到不同的日志框架中

 

通过不同的xxxxLogger加载不同的Log:如果能找到Log4j实现则加载Log4j;如果没有则使用Jdk14Logger;如果再没有使用Jdk13LumberjackLogger;如果再没有使用默认SimpleLog实现。

4. slf4j实现

原理是slf4j会在编译时会绑定 org.slf4j.impl.StaticLoggerBinder; 

该类里面实现对具体日志方案的绑定接入。

任何一种基于slf4j的实现都要有一个这个类。

如果有任意两个实现slf4j 的包同时出现,那就有可能酿就悲剧。。。

下图为logback包结构

 

5. log4j0-over-slf4j适配实现方式

 

 

 

 

原创粉丝点击