SLF4J中文手册
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
典型的使用模式
下面同样的代码展示了 SLF4J 的典型使用模式。注意第15行 {}-占位符 的使用。更多详细内容请查看FAQ中的问题 "What is the fastest way of logging?"
1: import org.slf4j.Logger;
2: import org.slf4j.LoggerFactory;
3:
4: public class Wombat {
5:
log4j2不打印日志6: final Logger logger = LoggerFactory.getLogger(Wombat.class);
7: Integer t;
8: Integer oldT;
9:
10: public void setTemperature(Integer temperature) {
11:
12: oldT = t;
13: t = temperature;
14:
15: logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
2: import org.slf4j.LoggerFactory;
3:
4: public class Wombat {
5:
log4j2不打印日志6: final Logger logger = LoggerFactory.getLogger(Wombat.class);
7: Integer t;
8: Integer oldT;
9:
10: public void setTemperature(Integer temperature) {
11:
12: oldT = t;
13: t = temperature;
14:
15: logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
16:
17: if(temperature.intValue() > 50) {
18: logger.info("Temperature has risen above 50 degrees.");
19: }
20: }
21: }
17: if(temperature.intValue() > 50) {
18: logger.info("Temperature has risen above 50 degrees.");
19: }
20: }
21: }
在部署阶段绑定某个日志框架
前面提到过,SLF4J 支持多种日志框架。SLF4J 发行包中自带几个用于“SLF4J绑定”的jar 文件, 每种绑定对应一种支持的日志框架。
slf4j-log4j12-1.7.2.jar
用于绑定 1.2版的log4j , 这是一个广泛使用的日志系统,当然你还要把log4j包加到classpath中
slf4j-jdk14-1.7.2.jar
用于绑定 java.util.logging, 作为JDK 1.4 的logging
slf4j-nop-1.7.2.jar
用于绑定 NOP, 不做任何操作.
slf4j-simple-1.7.2.jar
用于绑定 simple 的实现, 所有的打印会响应到 只有INFO或者更高的级别会被打印. 这个绑定在小型应用中非常有用。
slf4j-jcl-1.7.2.jar
用于绑定 Jakarta Commons Logging. 这个绑定会使得SLF4J 的日志功能委托JCL来完成.
还有除了SLF4J项目以外提供的绑定包,例如 logback 本身就实现了SLF4J。Logback的 ch.qos.logback.classic.Logger 类实直接实现了SLF4J 的 org.slf4j.Logger 接口。因此,结合logback使用 SLF4J 节省很多内存和计算的开销。
要切换日志系统,只需在classpath上替换slf4j的绑定则可。例如,你要从java.util.logging切换到log4j,只需要把 slf4j-jdk14-1.7.2.jar 替换为 slf4j-log4j12-1.7.2.jar
SLF4J不依赖于任何的特殊类加载器。实际上,每个SLF4J绑定都是在编译阶段使用且指定唯一一种日志框架。例如,slf4j-log4j12-1.7.2.jar绑定在编译阶段绑定使用log4j。在你的代码中,除了slf4j-api-1.7.2.jar意外,你只能在classpath中加入一种绑定。不要添加超过1个绑定。下面是这张图解释了总体的思路。
(underlying表示直接实现SLF4J的接口,adaptation表示通过适配器实现SLF4J的接口)
SLF4J的接口和它的各种适配器是非常简单的。大多数熟悉java语言的开发人员能够在一个小时内阅读和完全理解这些代码。因为SLF4J没有使用或者说没有直接访问类加载器,所以关于类加载器的知识不是必须的。因此,SLF4J没有类加载器和内存泄露的问题,在方面,common logging就相形见拙了。
有了简单明了的SLF4J接口和部署模型,对于一个新的日志系统,开发人员可以容易的开发SLF4J的绑定。
库
广泛使用的一些组件会在他们的代码中使用 SLF4J 接口,这是以避免强制用户使用某一种日志框架。因此,最终用户可以再部署阶段选择自己喜欢的日志框架并在classpath中加入对应框架的slf4j绑定包。以后,还可以通过替换一个新的slf4j绑定来使用另一种日志框架。这种方案被证明是简单且健壮的。
在1.6.0版本中,如果在classpath中没有到绑定,slf4j-api将会默认忽略所有打印请求。以
前,则会因为缺少org.slf4j.impl.StaticLoggerBinder类而抛出一个 NoClassDeFoundError的错误,从SLF4J 1.6.0器,则会发出一个唯一一次警告信息,说明缺少绑定并且往后的所有答应请求会被忽略。举个实例,Wombat框架依赖于SLF4J日志功能。为了避免强制最终用户使用某种日志框架,Wombat的发布包中包含了slf4j-api.jar且不包含任何绑定包。即便用户在classpath上缺少任何SLF4J绑定包,Wombat依然能工作。只有在用户决定开启使用日志功能的时候,他才需要安装绑定某种日志框架的SLF4J绑定包。
项目中的日志功能依赖
请注意,任何可嵌入使用的组件例如库或者框架,都不应该声明某个SLF4J绑定的具体依赖,只能声明依赖于slf4j-api. 有关SLF4j在可嵌入组件中使用的在FAQ里有相关讨论 logging configuration, dependency reduction and testing.
基于maven的传递依赖规则,对于“一般”项目(非库或者框架)来说,声明日志功能的依赖可以通过一条依赖声明完成。
LOGBACK-CLASSIC 如果你希望使用logback-classic 作为日志框架。你只需在l文
件中声明"ch.qos.logback:logback-classic"依赖(如下所示)。此外,logback-classic-1.0.7.jar 依赖会自动把slf4j-api-1.7.2.jar加载到你的项目。不过明确的声明slf4j-api-1.7.2.jar的依赖并没有错,也避免MAVEN默认的相关版本信息不如你所意。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.7</version>
</dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.7</version>
</dependency>
LOG4J 如果你希望使用log4j 作为日志框架。你只需在l文件中声明"org.slf4j:slf4j-log4j12"依赖(如下所示)。此外,slf4j-log4j12-1.7.2.jar, 依赖会自动把slf4j-api-1.7.2.jar加载到你的项目。不过明确的声明slf4j-api-1.7.2.jar的依赖并没有错,也避免MAVEN默认的相关版本信息不如你所意。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.2</version>
</dependency>
JAVA.UTIL.LOGGING 如果你希望使用java.util.logging 作为日志框架。你只需在l文件中声明"org.slf4j:slf4j-jdk14"依赖(如下所示)。此外,slf4j-jdk14-1.7.2.jar, 依赖会自动把slf4j-api-1.7.2.jar加载到你的项目。不过明确的声明slf4j-api-1.7.2.jar的依赖并没有错,也避免MAVEN默认的相关版本信息不如你所意。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.2</version>
</dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.2</version>
</dependency>
二进制兼容性
混用不同版本的slf4j-api.jar 和 slf4j绑定会导致问题。例如,你使用 slf4j-api-1.7.2.jar,然后你必须使用 slf4j-simple-1.7.2.jar,假若你使用了 slf4j-simple-1.5.5.jar 将不能正常工作。
不过,从用户的角度来看,所有版本的 slf4j-api 包都是兼容的。客户使用不通版本的slf4j-api-N.jar将不会有任何问题。你只需要保证你的slf4j绑定包的版本要匹配slf4j-api包的版本即可。
在初始化阶段,如果 SLF4J 检测到 slf4j-api 和 slf4j绑定包的版本冲突,将会发出一个警告。
通过SLF4J统一日志
很多时候,一个项目以来不同的组件,这些组件中依赖的日志api不是SLF4J的。一个项目依赖JCL(common logging),java.util.logging, log4j 和 SLF4J 的组合是很普遍的。因此,通过一个方式来统一日志则显得很有吸引力。SLF4J 通过提供 JCL,java.util.logging和log4j的桥接来满足这种普遍使用。更详细的内容参考Bridging legacy APIs.页面。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论