SLF4J只是一个门面(facet),它不包含具体的实现,而是将一些log4j,java.logging等实现包装成统一的接口。借用下图展示了常用日志文件的关系: 通过上面的图,可以简单的理清关系! commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现! log4j,logback等等才是日志的真正实现。 当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我服务。这些过程都是透明化的,用户不需要进行任何操作! 这里有个小故事,当年Apache说服 log4j以及其他的日志来按照commons-logging的标准编写,但是由于commons-logging的类加载有点问题,实现起来也不友 好,因此log4j的作者就创作了slf4j,也因此而与commons-logging两分天下。至于到底使用哪个,由用户来决定吧。 这样,slf4j出现了,它通过简单的实现就能找到符合自己接口的实现类,如果不是满足自己标准的日志,可以通过一些中间实现比如上面的slf4j-log4j12.jar来进行适配。好,言归正传,如何使用slf4j?一、使用slf4j快速入门首先,项目中必须要包括slf4j-api.jar,此外,还应该包括slf4j为具体实现所提供的适配器(如slf4j-log4j12.jar),以及那个具体实现的jar包(如log4j-1.**.jar)。我们以以下代码为例:import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Slf4jDemo { private static final Logger LOG = LoggerFactory.getLogger(Slf4jDemo.class); public static void main(String[] args) { LOG.error("Error Message!"); LOG.warn("Warn Message!"); LOG.info("Info Message!"); LOG.debug("Debug Message!"); LOG.trace("Trace Message!"); } } 由于所使用的具体实现不同,日志输出也有不同的结果。这也反应了通过使用slf4j,使得可以方便的替换日志系统。(一)Slf4j-simpleslf4j自带的一个简单实现,可用于小项目中,但无法配置日志级别等。官方文档中的描述为:Binding for Simple implementation, which outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.在项目的build_path中加入slf4j-1.6.6.jar与slf4j-simple-1.6.6.jar。输出结果如下:2 [main] ERROR Slf4jDemo - Error Message! 2 [main] WARN Slf4jDemo - Warn Message! 2 [main] INFO Slf4jDemo - Info Message! (二)slf4j-jdk 使用jkd自带的日志系统,在项目的build_path中加入slf4j-1.6.6.jar与slf4j-jdk14-1.6.6.jar。 输出结果如下: 二月 16, 2015 11:09:36 下午 Slf4jDemo main 严重: Error Message! 二月 16, 2015 11:09:36 下午 Slf4jDemo main 警告: Warn Message! 二月 16, 2015 11:09:36 下午 Slf4jDemo main 信息: Info Message!(三)slf4j-log4j log4j是目前用得最多的日志系统,它更适用于大型项目。 在项目的build_path中加入slf4j-1.6.6.jar与slf4j-log4j-1.6.6.jar,以及log4j的具体实现,如log4j-1.2.16.jar。输出结果如下:log4j:WARN No appenders could be found for logger (Slf4jDemo). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 可以通过配置文件配置输出日志的级别。二、一些注意事项1、注意build_path中不能有多个日志实现,否则会导致slf4j不知道该使用哪个实现,从而出现以下错误SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-jdk14-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory] log4j:WARN No appenders could be found for logger (Slf4jDemo). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.2、log4j的配置请见http://www.linuxidc.com/Linux/2014-10/108401.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-03/114636.htm