一、什么是SLF4J
我们在做Java开发时,如果需要记录日志,有很多日志API可供选择,如:
- java.util.logging
- Apache log4j
- logback
SLF4J又是个什么东东呢?为什么使用SLF4J比使用log4j或者java.util.logging更好呢?这是因为与所有提到的这些日志记录库相比,SLF4J没有真正地实现日志记录,相反它只是一个允许你使用任何处于后端的日志记录库的 抽象层 。
如果你正在编写内部或者外部使用的API或者应用库的话,那么你真的不需要让使用你所编写的库的客户端去选择使用某种日志库。
假设项目已经使用了log4j,而且你包含一个名为Apache Active MQ的库,这个库还依赖于另一个日志记录库logback的话,那么你还需要包含它们,
然而,如果Apache Active MQ使用了SLF4J的话,你可以继续使用你的日志记录库,而不需要痛苦地添加和维护新的日志记录框架。
简短的说,SLF4J让你的代码独立于任何特定的日志记录API,这个好的想法尤其适合于公共组件的API开发人员。
虽然日志记录库的抽象理念不是新的,Apache的commons logging日志记录库也用了这个理念,不过现在SLF4J很快就会成为Java世界里标准的日志记录库。
让我们看一些使用 SLF4J而不使用log4j,logback或者java.util.logging的理由。
二、宁愿使用SLF4J也不愿使用Log4J,logback和java.util.Logging?
1、独立于任何日志记录API库
正如前面所说,在代码中编写日志记录语句使用SLF4J的主要动机是让你的程序独立于任何特定的日志记录库,这些日志记录库可能需要与你现在配置不同的配置,而且还会引入更多令人头疼的维护问题。
2、占位符功能
然而除了这个之外,SLF4J API还有一个让你使用SLF4J而不是用长期感兴趣的 Log4j 更让人信服的功能,也就是占位符功能,在代码中用{}来表示。
占位符功能与 String的format()方法中 的%s非常相似,因为它在运行时刻才提取所提供的真正的字符串。这不仅缩减了代码中的许多字符串连接,而且减少了创建String对象所需要的资源。
即便在你生产环境日志级别比如DEBUG和INFO级别的字符串连接可能不需要的时候,仍然可以起到同样的效果。
由于 字符串是不可更改的 ,而且它们是在字符串池中创建的,这些字符串使用了 堆内存 ,当应用在生产环境中运行在ERROR级别的时候,字符串在大多数情况下就不是必须的,比如DEBUG语句里的字符串就不是必须的。
通过使用SLF4J,你可以延迟字符串的创建到运行时刻,这意味着只有在需要字符串的时候才创建它。
如果你已经使用了log4j,那么你已经熟悉把调试语句放入if()条件内的工作场景,而SLF4J占位符功能比log4j更适合这种场景。
三、如何使用SLF4J和Log4J来做日志
使用SLF4J需要引入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中添加下列依赖
顺便说一下,如果你对使用带参数版的日志方法感兴趣,那就需要引入SLF4J 1.7版本。
四、总结
选择SLF4J而不是直接选用Log4j, commons logging, logback 或者 java.util.logging的理由如下:
1)在你的开源库或者私有库中使用SLF4J,可以独立于任何的日志实现,这就意味着不需要管理多个库和多个日志文件。你的客户端将会体会到这一点。
2)SLF4J 提供了占位日志记录,通过移除对isDebugEnabled(), isInfoEnabled()等等的检查提高了代码的可读性。
3)通过使用日志记录方法,直到你使用到的时候,才会去构造日志信息(字符串),这就同时提高了内存和CPU的使用率。
4)做一个侧面的说明,越少的临时字符串,垃圾回收器就意味着越少的工作,这就意味着为你的应用程序提供更好的吞吐量和性能。
这些优势都只是冰山一角,当你开始使用SL4J并阅读它,你会学到更多的好处。我强烈建议,在java中任何新的代码开发,都应使用SLF4J而不是任何的日志API,包括log4J。