日志转调
简介
当我们应用配置了slf4j
&&logback
的组合,但是我们引用的jar
包里面用的却用了Log4j来执行日志输出,那么怎么统一控制,让jar
包里面的的日志也能按照我们工程配置的日志输出格式输出呢?日志转调这个时候就可以大显身手了
解析
以log4j转调为例,依赖转调包log4j-over-slf4j.jar
,这个jar
包创建了大部分log4j.jar
里面的类(类名包名都保持一致,但是实现不一样),关键是对Logger
类和其父类Category
的重新创建.
Category
类增加了对org.slf4j.Logger
的引用,并且在创建Logger
的时候同时创建对应的org.slf4j.Logger
public class Category { public void info(Object message) { differentiatedLog(null,CATEGORY_FQCN,LocationAwareLogger.INFO_INT, message, null); } void differentiatedLog(Marker marker, String fqcn, int level, Object message, Throwable t) { String m = convertToString(message); if (locationAwareLogger != null) { locationAwareLogger.log(marker, fqcn, level, m, null, t); } else { switch (level) { case LocationAwareLogger.TRACE_INT: slf4jLogger.trace(marker, m); break; case LocationAwareLogger.DEBUG_INT: slf4jLogger.debug(marker, m); break; case LocationAwareLogger.INFO_INT: slf4jLogger.info(marker, m); break; case LocationAwareLogger.WARN_INT: slf4jLogger.warn(marker, m); break; case LocationAwareLogger.ERROR_INT: slf4jLogger.error(marker, m); break; } } } }
当调用logger.info
的时候再内部实际调用的是slf4jLogger.info()
;
小结
log4j-over-slf4j
是通过重新创建log4j.jar
里面的类来实现转调