slf4j是一个facade门面,并不设计具体的日志输出。下面举个例子说明:
先假设你知道log4j或者其他日志工具有个打印日志的方法logger.info(msg)
,如果直接使用log4j或者其他日志工具,只需要在需要打印日志的时候调用其logger.info(msg)
,这里的logger
对象是属于log4j或者其他实际打印日志的工具。
问题来了,假如我们代码已经使用log4j的logger对象打印日志,当项目变化时想要改用其他日志工具比如jui或者logback等等,这时候不单是把log4j的jar包换成其他的,还要找出所有log4j打印日志的方法全部用其他工具方法改写,对于切换日志工具来说及其繁琐。而且,项目的变化和技术的变化可能就带来这种日志工具的改变。
slf4j为日志工具切换提供解决方案:
如上图所示,最顶层的slf4j-api门面提供了一套打印日志的API规范,比如slf4jLogger.info("msg")
,最底层是某个日志工具比如log4j的打印日志的具体实现,而中间是slf4j和log4j两者的适配器,这个适配器所作的工作大概如下伪代码所示:
public void info1(String msg){
//调用slf4j-log4j的适配器
log4j_adapter.info2(msg);
}
/*
* 适配器把slf4j API方法的参数调整为符合log4j的参数,