SLF4J - 一个允许你统一日志记录API的抽象层

一、什么是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。

时间: 2024-08-04 00:12:25

SLF4J - 一个允许你统一日志记录API的抽象层的相关文章

C# 面向切面编程--监控日志记录方案

背景:现在公司整体在做监控平台,要求把各个部分的细节都记录下来,在前台页面上有所显示,所以现在需要做的就是一个监控日志的记录工作,今天讲的就是渲染监控日志的例子. 现状:当前的渲染程序没有为监控日志记录预留代码接入口,因此要新增加监控日志势必要增加新的代码.但是如果只是单单在已有逻辑中新增日志记录的代码似乎不太合理:因为记录日志的代码很多都是一样的,直接插入代码有很多重复代码:原有代码已经上线并且运行良好,新增代码会破坏原有封装,甚至增加出错的可能:再者从设计的角度来说,记录日志不属于任何一个功

Net Core平台灵活简单的日志记录框架NLog初体验

Net Core平台灵活简单的日志记录框架NLog初体验 前几天分享的"[Net Core集成Exceptionless分布式日志功能以及全局异常过滤][https://www.cnblogs.com/yilezhu/p/9339017.html]" 有人说比较重量,生产环境部署也比较麻烦.因此就有了今天的这篇文章.如果你的项目(网站或者中小型项目)不是很大,日志量也不多的话可以考虑NLog+Mysql的组合.因为NLog具有高性能,易于使用,易于扩展和灵活配置的特点能够让你快速集成日

Net Core 2.1 日志记录框架NLog+Mysql配置

NLog是什么? 这里还是简单介绍一下吧,为了让小白也知道.NLog是一个灵活的免费日志记录平台,适用于各种.NET平台,包括.NET Core.NLog可以通过简单地配置就可以可以很方便的写入多个日志仓库中(数据库,文件,控制台). NLog在Net Core中怎么用啊? 用之前你得新建一个asp.net core项目吧.这里以net core api为例吧.如下图所示是博主刚刚创建的net core api项目. 建好项目之后干什么呢.当然得添加引用了.你可以随心所欲的使用Nuget或者命令

Spring MVC异常统一处理(异常信息的国际化,日志记录)

JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出).不可预知的异常需要处理.一般dao层.service层的异常都会直接抛出,最后由controller统一进行处理,每个过程都单独处理异常,且要考虑到异常信息和前端的反馈,代码的耦合度高,不统一,后期维护的工作也多. 同时还必须考虑异常模块和日志模块.国际化的支持. 因此需要一种异常处理机制将异常处理解耦出来,这样保证相关处理过程的功能单一,和系统其它模块解耦,

巧用CurrentThread.Name来统一标识日志记录(java-logback篇)

java版本支付中心,日志组件使用的是logback.logback.xml里日志pattern配置如下: <!--本地日志目录--> <property name="USER_HOME" value="${catalina.base}/logs/logback-srv" /> <property name="LOG_MSG" value="%X{sid}%d{yyyy-MM-dd HH:mm:ss.SSS

Spring Boot 日志记录 SLF4J

Spring Boot 日志记录 SLF4J 2016年01月12日 09:25:28 阅读数:54086 在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了. 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增加资源的消耗. 而Log4j 更为灵活在性能上也相比 System.out 要高,我们可以配置输出级别,可以指定多个日志文件分别记录不同的日志. 使用 System.out 是在当前线程执行的

IDEA项目搭建九——使用slf4j和logback进行日志记录

.简介 java里面日志分为两部分一个门面.一个实现,我们所熟知的SLF4j.Log4j.Log4j2.Logback的日志组件slf4j是门面提供的统一的入口,具体实现由log4j.log4j2.logback来实现 log4j由于太老作者自己也不打算重构了所以放弃 log4j2是apach的一个项目很好,但支持上面略有欠缺所以放弃 logback是之前log4j的作者自己开源的一个新的log组件,做了大量的调整及优化,性能及使用性上都有很大的提高,再加上沉淀了很多年又完全实现了slf4j,所

Java日志记录工具SLF4J介绍

SLF4J是什么 SLF4J是一个包装类,典型的facade模式的工具,对用户呈现统一的操作方式,兼容各种主流的日志记录框架,典型的有log4j/jdk logging/nop/simple/jakarta commons logging等. 有张图比较形象直观的展示这个知识: 下面给出几个maven配置的例子 logback-classic <dependency>   <groupId>ch.qos.logback</groupId>  <artifactId

巧用CurrentThread.Name来统一标识日志记录

先看下面的日志: 2017/5/21 18:00:01 [OrderQuery_180001914_C72FF]请求支付中心参数:{"order_no":"KB201705210000165","sign":"e6c3559cd4b36458b180f15bfcd9b5a5"} 2017/5/21 18:00:01 [OrderQuery_180001914_C72FF]支付中心验签通过. 2017/5/21 18:00:01