依赖jar
包:slf4j-api-x.x.x.jar,log4j.jar,slf4j-log4j12.jar
apache
log4j
并无实现slf4j
相应的接口,因此加了一层桥接层(slf4j-log4j12.jar
包里面的内容)来实现slf4j
对log4j
的调用slf4j-log4j12.jar
里面的代码很简单
只有5个类,关键的两个类是Log4jLoggerFactory
和Log4jLoggerAdapter
,对应Log4jLoggerFactory
的getLogger
方法源码:api
public Logger getLogger(String name) { Logger slf4jLogger = loggerMap.get(name); if (slf4jLogger != null) { return slf4jLogger; } else { org.apache.log4j.Logger log4jLogger; if(name.equalsIgnoreCase(Logger.ROOT_LOGGER_NAME)) log4jLogger = LogManager.getRootLogger(); else log4jLogger = LogManager.getLogger(name); Logger newInstance = new Log4jLoggerAdapter(log4jLogger); Logger oldInstance = loggerMap.putIfAbsent(name, newInstance); return oldInstance == null ? newInstance : oldInstance; } }
Log4jLoggerFactory
实现了slf4j
的ILoggerFactory
接口,调用getLogger
方法获取Logger
spa
Log4jLoggerAdapter
实现了slf4j
的Logger
接口,而且实际代理了org.apache.log4j.Logger
类,因此对Log4jLoggerAdapter
的全部方法调用,最终调用的都是org.apache.log4j.Logger
对应的方法代理
log4j
是经过slf4j-log4j12.jar
桥接包来完美适配slf4j
使用code