SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
在SLF4J发行版本中包含了几个jar包,如slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-log4j13.jar, slf4j-jdk14.jar and slf4j-jcl.jar通过这些jar文件可以使编译期与具体的实现脱离。我们在开发过程中可能使用各种log,每个Log有不同的风格、布局,如果想灵活的切换那么slf4j是比较好的选择。
官方的网站:http://www.slf4j.org/manual.html
slf4j最吸引我的地方是:占位符(place holder)的使用。占位符在代码中表示为“{}”的特性。占位符是一个非常类似于在String的format()方法中的%s,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了代码中字符串连接次数,而且还节省了新建的String对象。
下面是在Log4j中使用的方案,但这样做降低了代码可读性因为增加了不必要的繁琐重复代码(boiler-plate code):
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
但是如果你使用slf4j的话,你可以得到在极简洁的格式的结果,就像以下展示的一样:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
private Logger logger = LoggerFactory.getLogger(Demo.class);
public Logger getLogger() {
return logger;
}
public static void main(String[] args) {
Demo demo = new Demo();
Logger logger = demo.getLogger();
logger.info("Hello World {} {}", "JAVA", "C");
logger.debug("Hello World {} {}", "JAVA", "C");
logger.error("Hello World {} {}", "JAVA", "C");
logger.warn("Hello World {} {}", "JAVA", "C");
}
}
一、
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.4.3</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.4.3</version> </dependency>
结果:
0 [main] INFO Demo - Hello World JAVA C 0 [main] ERROR Demo - Hello World JAVA C 0 [main] WARN Demo - Hello World JAVA C
这是slf4j-simple风格,它没有debug日志。
二、
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.4.3</version>
</dependency>
结果:
2015-7-23 16:17:00 Demo main 信息: Hello World JAVA C 2015-7-23 16:17:00 Demo main 严重: Hello World JAVA C 2015-7-23 16:17:00 Demo main 警告: Hello World JAVA C
这是slf4j-jdk风格,它没有debug日志。
三、
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.4.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.4.3</version>
</dependency>
log4j的风格需要自己去配置log4j。