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。
SLF4J - 一个允许你统一日志记录API的抽象层的更多相关文章
- Spring Boot AOP 扫盲,实现接口访问的统一日志记录
AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...
- 在云环境上使用SLF4J对Java程序进行日志记录
我开发了一个Java应用,部署到云环境上之后,用postman测试发现不能按照我期望的工作,但是返回的消息对我没有任何帮助. 因为部署在云端的应用很难像本地Java应用一样调试,所以我打算用SLF4J ...
- Flunetd 用于统一日志记录层的开源数据收集器
传统的日志查看方式 使用fluentd之后 一.介绍 Fluentd是一个开源的数据收集器,可以统一对数据收集和消费,以便更好地使用和理解数据. 几大特色: 使用JSON统一记录 简单灵活可插拔架构 ...
- SpringBoot | 第二十四章:日志管理之AOP统一日志
前言 上一章节,介绍了目前开发中常见的log4j2及logback日志框架的整合知识.在很多时候,我们在开发一个系统时,不管出于何种考虑,比如是审计要求,或者防抵赖,还是保留操作痕迹的角度,一般都会有 ...
- Gin 框架 - 使用 logrus 进行日志记录
目录 概述 日志格式 Logrus 使用 推荐阅读 概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirup ...
- Gin框架 - 使用 Logrus 进行日志记录
概述 上篇文章分享了 Gin 框架的路由配置,这篇文章分享日志记录. 查了很多资料,Go 的日志记录用的最多的还是 github.com/sirupsen/logrus. Logrus is a st ...
- 利用AOP与ToStringBuilder简化日志记录
刚学spring的时候书上就强调spring的核心就是ioc和aop blablabla...... IOC到处都能看到...AOP么刚开始接触的时候使用在声明式事务上面..当时书上还提到一个用到ao ...
- ABP理论学习之日志记录
返回总目录 本篇目录 服务端 获取Logger 基类中的Logger 配置 客户端 服务端 ABP使用的是Castle Windsor的日志记录设备.它可以和不同的日志类库一起工作,比如Log4Net ...
- ASP.NET Core 异常处理与日志记录
1. ASP.NET Core 异常处理与日志记录 1.1. 异常处理 1.1.1. 异常产生的原因及处理 1.1.2. ASP.NET Core中启动开发人员异常页面 1.2. 日志记录 1.2.1 ...
随机推荐
- Appserv(Apache) 配置ssl证书
一:打开httpd.conf文件,移除注释的行: Include conf/extra/httpd-ahssl.conf LoadModule ssl_module modules/mod_ssl.s ...
- 免插件为WordPress文章中标签添加内链
给文章标签添加内链,意思就是说,如果你文章中出现了和标签一样的文字,那么这个文字就会自动成为标签链接,你点击这个链接就会查看到所有含有该标签的文章,这个能方便用户浏览,据说还利于SEO.下面说说方法: ...
- 用user-selection实现让页面上的内容不能被选中
最开始发现这个功能是在陌小雨的博客中,然后自己百度发现用的是user-selection功能,之前网上有很多关于禁止右键,禁止复制,禁止粘 贴,禁止剪切等都弱爆了.这个功能正好使用到我的网站上啊,(你 ...
- GEETEST极验召集互联网大佬齐聚光谷,共同探讨交互安全问题
全球互联网技术在飞速发展的同时,网络安全事件也随之频发.除了直接带来经济损失的网络恶意攻击之外,企业在多个方面也遭受着不同程度的网络恶意攻击,包括品牌形象.管理时间.企业竞争力.客户成交量.用户行为等 ...
- 设计模式 --> (14)中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了 ...
- 第一次使用github、git工具,本地仓库、远程仓库使用
一次使用git,记录下使用过程...可能还有很多东西可能还没理解,后期理解了再写吧 git是什么.,百度的回答: 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 使用过程一直在百度 ...
- 记一次sqoop同步到mysql
工作中需要用到将hive的数据导一份到mysql中,需求是这样的:hive每天会产生一份用户标签(tag)发生变化的结果表user_tag,这份结果同步到mysql中,并且保持一份全量表,存储当前用户 ...
- java基础笔记(8)----接口
接口 是特殊的抽象类,纯抽象类---所有方法都是抽象方法 接口和抽象类的区别: 相同点: 编译后,会分别生成对应的.class文件 都不能创建对象(实例化),但是可以生成引用(使用多态) 不同点: 抽 ...
- oracle exp(expdp)数据迁移(生产环境,进行数据对比校验)
前言:客户需要迁移XX 库 ZJJJ用户(迁移到其他数据库),由于业务复杂,客户都弄不清楚里面有哪些业务系统,为保持数据一致性,需要停止业务软件,中间件,杀掉oracle进程. 一.迁移数据倒出部分= ...
- Java基础学习笔记一 Java介绍
java语言概述 Java是sun公司开发的一门编程语言,目前被Oracle公司收购,编程语言就是用来编写软件的. Java的应用 开发QQ.迅雷程序(桌面应用软件) 淘宝.京东(互联网应用软件) 安 ...