zoukankan      html  css  js  c++  java
  • log4j-over-slf4j工作原理详解

    log4j-over-slf4j工作原理详解

    摘自:https://blog.csdn.net/john1337/article/details/76152906 

    置顶 2017年07月26日 17:19:39 阅读数:5374更多
    个人分类: slf4j
    版权声明:本文为博主原创文章,支持转载,但转载时请务必在明显位置,给出原文连接。 https://blog.csdn.net/john1337/article/details/76152906

    SLF4J作为一个服务很多日志框架的门店或者抽象,一些相关插件使用了设计模式中的门面模式以及代理模式,我们可以SLF4J这个框架很容易就切换具体的日志框架,比如logback、log4j等,还能将使用log4j日志框架输出的日志路由到SLF4J上(通过org.slf4j:log4j-over-slf4j:jar这个jar包实现)。

    特别需要指出的是SLF4J采用的是动态绑定具体日志框架的方式,根据classpath目录下放置的绑定jar包来实现绑定,常见绑定jar包如下:


    具体用法:使用log4j-over-slf4j取代log4j,这样log4j接口输出的日志就会通过log4j-over-slf4j路由到SLF4J上,这样即使系统(包含使用的第三方jar库,比如dubbo)都可以将日志最终路由到SLF4J上,进而集中输出。

    工作原理

    本文就以log4j-over-slf4j这个jar库为例来说明这其中的原理:

    这个里面使用的是迷惑战术,按照log4j库的目录排布放置几个相关类(比如Logger等),这样系统中使用log4j的代码编译就不会出错,但是这些代理logger内部实现时却将日志悄悄代理到了SLF4J相关接口,相关部分代码如下:

      public void debug(Object message)
      {
        differentiatedLog(null, CATEGORY_FQCN, 10, message, null);
      }

      public void info(Object message, Throwable t)
      {
        differentiatedLog(null, CATEGORY_FQCN, 20, message, t);
      }

    下面将揭开庐山真面目:

     protected Logger slf4jLogger;  --org.apache.log4j.Category类属性,该属性就是org.slf4j.Logger类型了,到此相信大家已经知道了绑定类的工作原理。

      void differentiatedLog(Marker marker, String fqcn, int level, Object message, Throwable t)
      {
        String m = convertToString(message);
        if (this.locationAwareLogger != null) {
          this.locationAwareLogger.log(marker, fqcn, level, m, null, t);
        } else {
          switch (level)
          {
          case 0: 
            this.slf4jLogger.trace(marker, m);
            break;
          case 10: 
            this.slf4jLogger.debug(marker, m);
            break;
          case 20: 
            this.slf4jLogger.info(marker, m);
            break;
          case 30: 
            this.slf4jLogger.warn(marker, m);
            break;
          case 40: 
            this.slf4jLogger.error(marker, m);
          }
        }
      }

  • 相关阅读:
    谈我们为什么学不好编程2——你是否已进入“等死模式”?
    JSP使用SmartUpload实现文件上传
    内核模块编程练习
    Vue++:Vue中 关于$emit的用法
    Vue++:Vue 脚手架在vue.config.js文件中配置scss全局变量
    Vue++:Vuecli3.0 脚手架搭建项目
    Java++:七个开源的 Spring Boot 前后端分离项目,一定要收藏!
    MySQL++:SQL 优化的15个小技巧
    RabbitMQ++:RabbitMQ 的队列(Queue)的参数及其含义
    Vue++:Vue 二级路由不显示页面问题
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/9612089.html
Copyright © 2011-2022 走看看