SLF4J 并无真正地实现日志记录,它只是一个容许你使用任何java日志记录库的抽象适配层。java
若是你正在编写内部或者外部使用的API或者应用库的话,若是使用了slf4j,那么你不须要让使用你所编写的库的客户端去选择日志库。后端
简短的说,SLF4J让你的代码独立于任何特定的日志记录API,这个好的想法尤为适合于公共的API开发人员。api
日志记录库的抽象理念不是新的,并且Apache的commons logging日志记录库也是用了这个理念,不过如今SLF4J很快就会成为Java世界里标准的日志记录库。 框架
正如我前面所说,在你的代码中编写日志记录语句使用SLF4J的主要动机是让你的程序独立于任何特定的日志记录库,这些日志记录库可能须要与你如今配置不一样的配置,并且还会引入更多使人头疼的维护问题。maven
然而除了这个以外,SLF4J API还有一个让你使用SLF4J而不是用长期感兴趣的 Log4j 更让人信服的功能,也就是占位符功能,在代码中用{}来表示。工具
占位符功能与 String的format()方法中 的%s很是类似,由于它在运行时刻才提取所提供的真正的字符串。这不只缩减了代码中的许多字符串链接,并且减小了建立String对象所须要的资源。spa
即使在你生产环境日志级别好比DEBUG和INFO级别的字符串链接可能不须要的时候,仍然能够起到一样的效果。.net
因为 字符串是不可更改的 ,并且它们是在字符串池中建立的,这些字符串使用了 堆内存 ,当应用在生产环境中运行在ERROR级别的时候,字符串在大多数状况下就不是必须的,好比DEBUG语句里的字符串就不是必须的。调试
经过使用SLF4J,你能够延迟字符串的建立到运行时刻,这意味着只有在须要字符串的时候才建立它。若是你已经使用了log4j,那么你已经熟悉把调试语句放入if()条件内的工做场景,而SLF4J占位符功能比log4j更适合这种场景。日志
除了上面所说的好处,我认为还有个警告须要说一下,为了使用SLF4J你不只须要进入SLF4J API Jar包,好比slf4j-api-1.6.1.jar,还须要引入协同工做的JAR包,具体是什么jar包则依赖于后端你使用了什么日志工具库。
假如你想使用SLF4J,还想使用Lo4J,那么你须要把下列jar包引入到你的classpath中,具体版本要视你使用的SLF4J和log4J版本而定, 好比:
slf4j-api-1.6.1.jar - JAR for SLF4J API
log4j-1.2.16.jar - JAR for Log4J API
slf4j-log4j12-1.6.1.jar - Log4J Adapter for SLF4J
若是你正在使用Maven来管理你的项目依赖,你能够只引入SLF4J JAR,而后maven会引入它所依赖的其它JAR包。为了使用Log4J和SLF4J,你能够在你项目的pom.xml中添加下列依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
具体使用哪一种日志框架,就要提供哪一种日志框架的配置文件