Simple Logging Facade for Java (SLF4J)
slf4j可以看成是对各个日志框架的一种抽象,它提供了一套通用的日志使用接口。
下面是slf4j的几个版本比较:
1.6.0 如果没有绑定底层的日志框架的话,默认会有一个no-operation (nop)logger 的实现
1.7.0 打印方法可以指定参数类型,但是要求jdk5或以上的版本
1.7.5 更快的检索速度,所以推荐使用1.7.5或以上版本
1.7.9 通过设置能自动检测出代码中日志记录器不一致的情况,比如下面这种情况:
package com.acme;
import com.foo.Kangaroo; class Fruit {
Logger logger = LoggerFactory.getLogger(Kangaroo.class);
}
系统就会抛出警告:SLF4J: Detected logger name mismatch. Given name: "com.foo.Kangaroo"; computed name: "com.acme.Fruit".
下面这种情况除外:
class A {
Logger logger = LoggerFactory.getLogger(getClass());
}
class B extends A {
// no mismatch warning will be issued when B is instantiated
// given that class A is a super-type of class B
}
slf4j / commons logging(jcl) / log4j / logback / java.util.logging(jul)的区别
slf4j和comms logging 都是接口而非实现 常用的实现有:log4j 、logback 、jul 等
基于slf4j接口各个日志系统实现关系图如下:
使用日志系统时包的搭配如下:
其中jcl-over-slf4j.jar:覆盖jcl、log4j-over-slf4j.jar: 覆盖log4j 、jul-to-slf4j.jar:安装SLF4JHandler必需要用的包
使用slf4j经常会碰到以下几种错误
Failed to load class org.slf4j.impl.StaticLoggerBinder
这种情况出现的原因是没有指定具体的底层日志实现,遇到这种情况可以考虑添加如下依赖包中的一种:slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar 如果不做日志的操作可以考虑添加slf4j-nop.jar
Multiple bindings were found on the class path
一个项目中出现多个实现,比如同时存在log4j和logback,之前项目开发时就遇到过一种情况,我们日志系统里面使用的是log4j,但是在maven里面引入别的系统用的是logback,由于没有考虑到这种情况,最终在上线的时候内存瞬间被打印出来的日志信息占满。使得上线失败,最后采用清理系统,然后回滚到之前项目的方式才避免了损失。通过一番检查才发现是由于引入的系统用的logback,在项目部署的时候系统会寻找相应的logback的配置信息,但是问题来了,我们项目里面没有logback的配置,只有log4j配置,这个时候logback会按照默认的日志方式去打印,默认的日志级别是debug,最终造成所有的日志信息都被打印出来,下面是个人的一些关于解决项目冲突的总结:
slf4j在绑定日志底层实现时,如果使用Maven的话,Maven默认的加载机制会导致slf4j加载最终绑定pom.xml文件中排在前面的实现。如果非Maven的情况可以考虑成是随机的,由JVM决定:下面是官方的解释:The way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random.
解决上面出现的问题有两种方式:
第一方式:删除到不用的日志底层实现jar包,只使用其中之一
第二种方式:排除对于具体日志的实现方式
<dependencies>
<dependency>
<groupId> org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
<version>0.8.1</version> <exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions> </dependency>
</dependencies>