1、基本介绍
各种不同的日志库,如java.util.logging、Apache log4j、logback。
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 API的特性是使得我坚持使用SLF4J而抛弃我长期间钟爱的Log4j的理由,是被称为占位符(place holder),在代码中表示为“{}
”的特性。占位符是一个非常类似于在String
的format()
方法中的%s
,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了你代码中字符串连接次数,而且还节省了新建的String对象。通过使用SLF4J,你可以在运行时延迟字符串的建立,这意味着只有需要的String对象才被建立。而如果你已经使用log4j,那么你已经对于在if条件中使用debug语句这种变通方案十分熟悉了,但SLF4J的占位符就比这个好用得多。
这是你在Log4j中使用的方案,但这并不有趣,而且降低了代码可读性,因为它增加了不必要的繁琐重复代码(boiler-plate code):
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
另一方面,如果你使用SLF4J的话,你可以得到更简洁格式的结果,就像以下展示的一样:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
在SLF4J,我们不需要字符串连接而且不会导致暂时不需要的字符串消耗。取而代之,我们在一个以占位符和参数传递实际值构成的模板格式下写日志信息。你可能会在想万一我有很多个参数怎么办?嗯,那么你可以选择使用变量参数版本的日志方法或者以Object数组传递。这是一个相当方便和高效方法的打日志方法。记住,在生产最终日志信息字符串之前,这个方法会检查一个特定的日志级别是不是打开了,这不仅降低了内存消耗而且预先降低了CPU去处理字符串连接命令的时间。这里是使用SLF4J日志方法的代码,来自于slf4j-log4j12-1.6.1.jar中的Log4j的适配器类Log4jLoggerAdapter。
public void debug(String format, Object arg1, Object arg2) {
if (logger.isDebugEnabled()) {
FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
}
}123456
同时,我们应该知道打日志是对应用程序性能有着很大影响,在生产环节上我们建议只进行必要的日志记录。> >
commons-logging与slf4作用类似
3、commons-logging与其他日志框架集成
框架 | 需要的jar |
---|---|
jdk-logging | commons-logging |
log4j1 | commons-logging、log4j |
log4j2 | log4j-jcl(集成包) |
logback | logback-classic、jcl-over-slf4j(2个集成包,可以不再需要commons-logging) |
slf4j | jcl-over-slf4j(集成包,不再需要commons-logging) |
4、slf4j与其他日志框架集成
框架 | 需要的jar |
---|---|
jdk-logging | slf4j-jdk14(集成包) |
log4j1 | slf4j-log4j12(集成包) |
log4j2 | log4j-slf4j-impl(集成包) |
logback | logback-classic(集成包) |
commons-logging | slf4j-jcl(集成包) |
Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
Log4j2:log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging):logging.properties
Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项。
默认的命名规则,并且放在 src/main/resources 下面即可
注意:
在maven导包的时候,注意 scope标签值不能为test,,test表示只有在测试环境下,才可以使用。要么没有scope,要么值不能为test。
dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>