Java日志系统FAQ

slf4j只是一个门面(facet),它不包含具体的实现,而是将一些log4j,java.logging等实现包装成统一的接口。

    commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!

  log4j,logback等等才是日志的真正实现。

  当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我服务。这些过程都是透明化的,用户不需要进行任何操作!


可以与slf4j组合使用的日志框架实现有:

  1. Slf4j-simple,slf4j自带的一个简单实现,可用于小项目中,但无法配置日志级别等。

  2. slf4j-jdk,使用jkd自带的日志系统,在项目的build_path中加入slf4j-1.6.6.jar与slf4j-jdk14-1.6.6.jar。

  3. slf4j-log4j log4j是目前用得最多的日志系统,它更适用于大型项目。 在项目的build_path中加入slf4j-1.6.6.jar与slf4j-log4j-1.6.6.jar,以及log4j的具体实现,如log4j-1.2.16.jar。


FAQ:

  1. 注意build_path中不能有多个日志实现,否则会导致slf4j不知道该使用哪个实现,从而出现以下错误:

  2. SLF4J: Class path contains multiple SLF4J bindings.
  3. 由于很多项目都会使用log4j作为日志框架,而在一个项目的引用包中的log4j配置文件有可能将自己定义的log4j.properties文件覆盖。如果发现自己的log4j配置文件不生效,则使用:java -Dlog4j.debug 主类来检查目前加载了哪个配置文件,然后将其删除即可。

  4. 另外,即使使用了PropertyConfigurator.configure(“log4j2.properties”); 指定配置文件,也有可能被第三方jar包使用同样语句覆盖了。

  5. CLASSPATH中不能有多个log4j的版本本,否则有有奇形怪状的NoSuchMethod, NoSuchFiled, NoClassDefineFound等异常。

  6. 配置文件啊,如果你引用的第三方包有log4j.properties,而又没有提供给你编辑,那恭喜你,慢慢调吧。把log4j的配置写入代码吧,不要用配置文件了

  7. 如果你打算只使用log4j,而不使用slf4j作包装,切记classpath中只能有log4j,不能有log4j-over-slf4j-1.7.12.jar这种包,不然会出现各种各样的错误,如: NoSuchMethod, NoSuchFiled, NoClassDefineFound, IncompatibleClassChangeError: Implementing class



你可能感兴趣的:(java,log)