SLF4J(Simple Logging Facade for Java)作为一个简单的门面或者抽象对象服务于各种日志框架,比如java.util.logging,logback,log4j。SLF4J允许终端用户在部署时插入想使用的日志框架。注意,在你的库/应用中启用SLF4J意味着只需添加一个叫做slf4j-api-*.jar的强依赖。
Hello World
编程的传统惯例,这是一个例子,演示了使用SLF4J用最简单的方式输出“Hello World”。它开始于用名称“HelloWorld”获取一个logger对象。logger用来记录“Hello World”消息。
1 |
import org.slf4j.Logger; |
为了运行这个例子,首先你需要下载slf4j,然后解压它。解压完添加slf4j-api-*.jar文件到你的类路径中。
编译运行HelloWorld会在控制台中输出如下的结果:
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
打印警告信息的原因是在你的类路径中找不到slf4j的绑定。
一旦你添加一个绑定到你的类路径中,警告就会消失。假设你添加了slf4j-simple-1.8.0-beta2.jar,你的类路径需要包含:
- slf4j-api-1.8.0-beta2.jar
- slf4j-simple-1.8.0-beta2.jar
现在编译运行HelloWorld会在控制输入如下结果:
0 [main] INFO HelloWorld - Hello World
经典使用模式
下面的示例代码演示了SLF4J的经典使用模式。注意,在第15行使用的占位符{},更多细节参考FAQ“What is the fastest way of logging?”。
1 |
import org.slf4j.Logger; |
在部署时与日志框架绑定
如之前提到的,SLF4J支持各种日志框架。SLF4J发行版附带了几个叫做“SLF4J bindings”的jar文件,每个文件对应一个支持的框架。
slf4j-log4j12-1.8.0-beta2.jar
广泛使用的日志框架:log4j1.2版本的绑定。你还需要把log4j.jar放到你的类路径中。
slf4j-jdk14-1.8.0-beta2.jar
JDK1.4中java.util.logging的绑定
slf4j-nop-1.8.0-beta2.jar
NOP的绑定,默默丢弃所有的日志。
slf4j-simple-1.8.0-beta2.jar
简单日志实现的绑定,这会输出所有的事件到System.err中。只有INFO或者更高级别的消息会被打印。这种绑定往往在简单的应用中很有用。
slf4j-jcl-1.8.0-beta2.jar
Jakarta Commons Logging的绑定。此绑定会委派所有SLF4J日志记录到JCL。
logback-classic-1.0.13.jar (requires logback-core-1.0.13.jar)
原生实现SLF4J项目外还会有SLF4J的绑定,例如,原生实现SLF4J的logback。Logback的ch.qos.logback.classic.Logger类直接实现了SLF4J的org.slf4j.Logger接口。从而,将SLF4J和logback结合使用会严格限制0内存和计算开销。
要切换日志框架,替换类路径中的slf4j绑定就可以了。举个例子,要切换java.util.logging到log4j,用slf4j-log4j12-1.8.0-beta2.jar替换slf4j-jdk14-1.8.0-beta2.jar。
SLF4J不依赖于任何特殊的类加载器。实际上,每个SLF4J绑定在编译时都是硬连线的,使用有且只有一个特定的日志框架。举个例子,slf4j-log4j12-1.8.0-beta2.jar在编译时被绑定使用log4j。在你的代码中,除了slf4j-api-1.8.0-beta2.jar,你只需要将有且只有一个你选择的绑定放到合适的类路径中。不要在类路径中放超过一个绑定。这有一个图解说明。
SLF4J的接口以及接口的各个适配器是非常简单的。大多数熟悉java语言的开发者应该有能力在一个小时内阅读和完全理解它的代码。不需要类加载器的知识,因为SLF4J不需要也无法直接访问任何类加载器。因此,SLF4J不会遇到Jakarta Commons Logging(JCL)出现的没有类加载器和内存泄露的问题。
鉴于SLF4J接口以及其部署模型的简单性,新的日志框架开发人员应该会非常容易编写SLF4J绑定。
近期评论