之前在项目中用的日志记录器都是log4j的日志记录器,可是到了新公司发现都是slf4j,于是想着研究一下slf4j的用法。
1 基本介绍
SLF4J不同于其他日志类库,与其它日志类库有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。
如果一个项目已经使用了log4j,而你加载了一个类库,比方说 Apache Active MQ——它依赖于于另外一个日志类库logback,那么你就需要把它也加载进去。但如果Apache Active MQ使用了SLF4J,你可以继续使用你的日志类库而无需忍受加载和维护一个新的日志框架的痛苦。
总的来说,SLF4J使你的代码独立于任意一个特定的日志API,这是对于API开发者的很好的思想。虽然抽象日志类库的思想已经不是新鲜的事物,而且Apache commons logging也已经在使用这种思想了,但SLF4J正迅速成为Java世界的日志标准。让我们再看几个使用SLF4J而不是log4j、logback或者java.util.logging的理由。
2 SLF4J对比Log4J,logback和java.util.Logging的优势
正如我之前说的,在你的代码中使用SLF4J写日志语句的主要出发点是使得你的程序独立于任何特定的日志类库,依赖于特定类库可能需要使用不同于你已有的配置,并且导致更多维护的麻烦。除此之外,还有一个SLF4J API的特性是使得我坚持使用SLF4J而抛弃我长期间钟爱的Log4j的理由,是被称为占位符(place holder),在代码中表示为“{}
”的特性。占位符是一个非常类似于在String
的format()
方法中的%s
,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了你代码中字符串连接次数,而且还节省了新建的String对象。通过使用SLF4J,你可以在运行时延迟字符串的建立,这意味着只有需要的String对象才被建立。而如果你已经使用log4j,那么你已经对于在if条件中使用debug语句这种变通方案十分熟悉了,但SLF4J的占位符就比这个好用得多。
3.slf4j的简单用法
package test2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Slf4jTest { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(Slf4jTest.class);// slf4j日志记录器 // 普通的日志记录 logger.debug("普通的日志记录"); // {}占位符记录日志 for (int i = 0; i < 3; i++) { logger.debug("这是第{}条记录", i); } // 用\转义{} logger.debug("Set \\{} differs from {}", "3"); // output:Set {} differs // from 3 // 两个参数 logger.debug("两个占位符,可以传两个参数{}----{}", 1, 2); } }
结果:
20:24:46,368 DEBUG Slf4jTest:12 - 普通的日志记录
20:24:46,371 DEBUG Slf4jTest:16 - 这是第0条记录
20:24:46,371 DEBUG Slf4jTest:16 - 这是第1条记录
20:24:46,371 DEBUG Slf4jTest:16 - 这是第2条记录
20:24:46,371 DEBUG Slf4jTest:20 - Set {} differs from 3
20:24:46,371 DEBUG Slf4jTest:24 - 两个占位符,可以传两个参数1----2
至于详细的日志级别的介绍参考我的另一篇博客:http://www.cnblogs.com/qlqwjy/p/7192947.html
原文地址:https://www.cnblogs.com/qlqwjy/p/9275415.html