[Java基础]slf4j和common-logging日志系统的原理

本文介绍了SLF4J日志框架的工作原理及如何与不同日志系统(如Log4j、java.util.logging)无缝集成。通过使用外观模式,SLF4J允许开发者在部署时选择所需的具体日志系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网:http://slf4j.org/index.html,http://slf4j.org/manual.html#binding

The Simple Logging Facade for Java or (SLF4J) serves as a simple facade or abstraction for various logging frameworks, e.g. java.util.logging, log4j and logback, allowing the end user to plug in the desired logging framework at deployment time.

 

 

    slf4j可以说只是一个壳,使用外观模式,底层的具体log系统可以是“Log4j和java.util.logging,JCL,NOP,simple”。具体使用时,您的代码(特别适合用于您的代码将作为第三方的jar包供别人使用)中,直接使用slf4j-api-1.6.1.jar。

 

    而在别人使用您的jar包时,如果他们的日志系统是Log4j或ava.util.logging则他们将在classpath路径中添加slf4j-log4j12-1.6.1.jar或slf4j-jdk14-1.6.1.jar,这样,您的代码的日志就可以和他们使用的日志系统融合一体了。

 

    具体看log4j12-1.6.1.jar或slf4j-jdk14-1.6.1.jar,是这样简单的几个类:


JCL,Log4j和JDK14都分别有自己的个性的Adapter和Factory,而StaticLoggerBinder等3个类则都是一样的,都是org.slf4j.impl.*。

可想而知,这3个bind的jar,都含有具体的实现类,只能使用其中一个jar。

 

  原理介绍--静态绑定
        大家看到要使用哪种日志系统,只需要将对应的日志系统所需要的jar包文件(包括slf4j提供的jar包和日志系统自身依赖 的jar包,例如:slf4j-log4j12-1.5.10.jar和log4j.1.2.jar)放入classpath即可,slf4j可以自动探 测具体使用哪种日志系统,这种技术被称为静态绑定。
       在实际使用中,我们通过LoggerFactory.getLogger()获得logger,查看LoggerFactory的源代码会发现如下两点,
  • LoggerFactory通过StaticLoggerBinder.getSingleton().getLoggerFactory()获得LogFactory,然后再通过该LogFactory来获取logger的
  • 但是StaticLoggerBinder类并不在slf4j-api-1.5.10.jar中,分析与具体日志系统相关的jar包,会发现每个 jar包都有一个StaticLoggerBinder类的实现(如slf4j-log4j12-1.5.10.jar、slf4j-simple- 1.5.10.jar、slf4j-jdk14-1.5.10.jar均有StaticLoggerBinder类实现),这就很明白了,slf4j在启 动时会动态到classpath中查找StaticLoggerBinder类,找到之后就可以生成对应日志系统的日志文件了。
    这里就有一个问题了,slf4j是如何将自己的通用日志格式转成不同的日志系统的格式的呢?
    我们再分析每个日志系统相关的源代码,会发现不同日志系统包都会有一个Adapter,用来在slf4j和不同日志系统之间做转换。


我在看 slf4j-api-1.5.10.jar 时,发现确实没有org.slf4j.impl.*这个包,这个包是在具体的slf4j-log4j12-1.6.1.jar或slf4j-jdk14-1.6.1.jar等中。
而看 slf4j-api-1.6.1-sources.jar 时,却看到org.slf4j.impl.*这个包,里面的那3个类都有,只不过都是抛出“throw new UnsupportedOperationException("This code should have never made it into the jar");”,可想而知,只是为了方便slf4j在开发时,能够顺利编译,在打包成jar时,并不会将org.slf4j.impl.*打包到jar中。如果你在具体使用时,只添加slf4j-api-1.5.10.jar,使用时会抛出not class found的错误的,因为找不到org.slf4j.impl下的类。

 

 

 

 

另外:

 

http://blog.youkuaiyun.com/hbcui1984/archive/2010/01/05/5138883.aspx

 

Apache Commons Logging 和 slf4j也一样,都是Depends on the underlying framework,不过听说commons logging是按顺序查询具体日志系统,commons logging.jar本身带有所有日志系统的Facade了,无须在使用时再按照具体日志系统添加依赖。

见http://en.wikipedia.org/wiki/Java_logging_framework

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值