SLF4j是Apache Common Logging的代替者。
Apache Common Logging使用的是动态绑定来确定具体日志库,在运行时从classpath中寻找可用的具体日志库,这样会产生很多classloader和classpath相关的问题,而且很难排查。
和Apache Common Logging不同,SLF4j采用了静态绑定来确定具体日志库。静态绑定就是为每一个具体的日志库写一个包名和类名都相同类: org.slf4j.impl.StaticLoggerBinder,这个类的功能就是调用具体的日志库。这个类会存放在Adaptation layer或者native implementation of slf4j-api的jar包中。SLF4j的使用者只要把具体日志库对应的Adaptation layer或者native implementation of slf4j-api的jar包放入classpath中,SLF4j便会装载(load)对应版本的org.slf4j.impl.StaticLoggerBinder,从而调用具体的日志库。
下图是调用关系图
下图是从SLF4j官网(http://www.slf4j.org/manual.html)截取的架构图,红框中是我标注的每个jar包中和绑定有关的关键类。