资讯专栏INFORMATION COLUMN

SLF4J

Cruise_Chan / 942人阅读

摘要:方法会调即启动当前的,一般就是,若返回为空,则调。若存在多个日志框架,则类加载的有多个,所以是为载入。的方法会调用,若返回的大小超过,则警告。通过完成初始化,即实例化具体的赋值给内部的,如。

SLF4J(Simple logging Facade for Java)是一个日志框架的适配器。
如果一个项目已经使用了log4j,而你加载了Apache Active MQ——它依赖于于另外一个日志类库logback,那么你就需要把logback也加载进来。但如果Apache Active MQ使用了SLF4J,你可以继续使用log4j,而无需加载和维护一个新的日志框架。或者添加XXX-over-slf4j.jar可以将xxx的日志输出转向到slf4j,然后slf4j将日志交由真正的日志实现框架来输出

几个jar提一下:
jcl-over-slf4j 将Commons Logging API输出转向到slf4j输出。
log4j-1.2-api 将log4j适配到log4j2,从而程序不用修改。
log4j-jcl 将Commons Logging API输出转向到log4j2输出。

Slf4j启动

关键在于slf4j-api-xxx.jar中org.slf4j.LoggerFactory:

  // org/slf4j/impl/StaticLoggerBinder.class为log4j-slf4j-impl-xxxjar中的类,所以用字符串声明,避免具体依赖。
  private static String STATIC_LOGGER_BINDER_PATH = "org/slf4j/impl/StaticLoggerBinder.class";

  private static Set findPossibleStaticLoggerBinderPathSet() {
    // use Set instead of list in order to deal with  bug #138
    // LinkedHashSet appropriate here because it preserves insertion order during iteration
    Set staticLoggerBinderPathSet = new LinkedHashSet();
try {
//一般就是AppClassLoader
      ClassLoader loggerFactoryClassLoader = LoggerFactory.class
              .getClassLoader();
      Enumeration paths;
     //每一种类加载器加载指定的*.class文件会得到不同的Class,这里必须要保证LoggerFactory的类加载器与StaticLoggerBinder的类加载是相同的。
//ClassLoader.getSystemResources方法会调getSystemClassLoader()即启动当前application的classloader,一般就是AppClassLoader,若返回为空,则调getBootstrapResources()。 
//若存在多个日志框架,则类加载的URL有多个,所以是Enumeration
      if (loggerFactoryClassLoader == null) {//LoggerFactory为Bootstrap Loader载入。
        paths = ClassLoader.getSystemResources(STATIC_LOGGER_BINDER_PATH);
      } else {
        paths = loggerFactoryClassLoader
                .getResources(STATIC_LOGGER_BINDER_PATH);
      }
      while (paths.hasMoreElements()) {
        URL path = (URL) paths.nextElement();
        staticLoggerBinderPathSet.add(path);
      }
    } catch (IOException ioe) {
     ......
    }
    return staticLoggerBinderPathSet;
  }

LoggerFactory的bind()方法会调用findPossibleStaticLoggerBinderPathSet(),若返回Set的大小超过1,则警告。通过StaticLoggerBinder.getSingleton()完成初始化,即实例化具体的factory赋值给内部的ILoggerFactory,如 loggerFactory = new Log4jLoggerFactory();。
不同的日志框架有相应的不同的xxx-slf4j-impl.jar,不同的StaticLoggerBinder.class决定了slf4j使用哪种日志框架。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67266.html

相关文章

  • SpringBoot(三)日志

    摘要:日志消息,是换行符如果使用作为日志配置文件,还要使用功能,会有以下错误切换日志框架可以按照的日志适配图,进行相关的切换的方式切换为 三、日志 1、日志框架 小张;开发一个大型系统; 1、System.out.println();将关键数据打印在控制台;去掉?写在一个文件? 2、框架来记录系统的一些运行时信息;日志框架 ; zhanglogging.jar; 3、高大上的几个功能?异步...

    arashicage 评论0 收藏0
  • 如何配置SLF4J不同的日志实现

    摘要:想要看级别的信息,你需要在启动时传入这个系统属性使用与日志现在我们可以试验并更换不同的日志实现,但你的程序代码可以保持不变。我们要做的是用另一个流行的日志实现来替换掉,比如。又一次,我们必须对我们选的每一个日志实现做配置。 使用slf4j库作为你的Java应用日志API层有很多好处,这里我会展示一小部分关于如何使用和配置它的例子。 你可以把slf4j想成一个Java的接口,然后你需要实...

    bovenson 评论0 收藏0
  • Java日志那些事

    摘要:但是考虑到各不相同,所以出现了等日志框架。日志框架只是统一的,其底层的具体的日志记录工作还是由等承担。如何选择和搭配日志系统目前来说,新应用使用是首选,一些老系统中很可能使用的是等。所以若日志冲突时,使用的三方库只需要相应的实现库即可。 日志系统的发展 我们日常接触到的日志系统有很多种,log4j,JUL(jdk自带),logback等,我们可以直接根据对象的日志API进行使用。但是考...

    GeekQiaQia 评论0 收藏0
  • LogBack入门实践

    摘要:日志名的从开始,自动递增就是指抛出的异常,是显示全部,如果在中写入数字,则表示展示多少行重点来了,上边都是输出源。 一、简介 LogBack是一个日志框架,它是Log4j作者Ceki的又一个日志组件。 LogBack,Slf4j,Log4j之间的关系 slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志F...

    马永翠 评论0 收藏0
  • Java 日志系列篇二 slf4

    摘要:的桥接器这个桥接器将所有日志委派给的原生实现,直接实现了的接口,因此使用与的搭配也暗示了严格的零内存计算溢出未完待补充 起手式 忘了什么时候听老师说过,牛逼的公司只管定义接口,屌丝厂商实现接口,类似 JDBC 的实现便是如此,用在 slf4j, 总觉得有些类似,本来 SUN 有机会在需求产生之前设计一套漂亮的日志框架来一统天下,可惜偏偏要拖到 JDK1.4, 而这套原生的日志框架也没有...

    maybe_009 评论0 收藏0
  • Tomcat启动log:SLF4J: Class path contains multiple SL

    摘要:近期启动时,看到如下输出信息并伴随严重错误警告打开的日志记录,看到的错误信息如下唉呀妈呀脑瓜疼,脑瓜疼啊脑瓜疼于是在挣扎了一天之后,头发都挠没了,终于找到一个靠谱的解决方案,不得不感谢百度的强大这就是包冲突了啊啊啊啊啊 近期启动tomcat时,看到如下输出信息:SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found...

    Jeff 评论0 收藏0

发表评论

0条评论

Cruise_Chan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<