log4j-over-slf4j工作原理详解

时间:2022-09-05 16:17:11

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-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);
      }
    }
  }

log4j-over-slf4j工作原理详解的更多相关文章

  1. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...

  2. ASP.NET页面与IIS底层交互和工作原理详解

    转载自:http://www.cnblogs.com/lidabo/archive/2012/03/13/2393200.html 第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是 ...

  3. ASP.NET页面与IIS底层交互和工作原理详解(第一回)

    引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个特定 ...

  4. 交换机工作原理、MAC地址表、路由器工作原理详解

    一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据 ...

  5. HTTP响应报文与工作原理详解

    超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到 ...

  6. 【转】HTTP响应报文与工作原理详解

    超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到 ...

  7. Hadoop MapReduce八大步骤以及Yarn工作原理详解

    Hadoop是市面上使用最多的大数据分布式文件存储系统和分布式处理系统, 其中分为两大块分别是hdfs和MapReduce, hdfs是分布式文件存储系统, 借鉴了Google的GFS论文. MapR ...

  8. HTTP响应报文与工作原理详解(转)

    超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议.HTTP 是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;服务器接到 ...

  9. Java虚拟机工作原理详解 (一)

    一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassNam ...

随机推荐

  1. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  2. 面试iOS遇到这种笔试《操作评估》

    一.开发团队需求: 开发一款软件需要前端后台和推广的人.1,首先要明确设计这个APP的理念2,合理的列出APP的需求3,找到后台人员让他们搭好后台数据4,前端的人负责展示到界面上5,推广人员负责让更多 ...

  3. Unable to start activity ComponentInfo&lbrace;com&period;first&sol;com&period;first&period;Game&rcub;

    原因一: xxx的错误,若为R.layout.main  那么应该是main.xml文件中的标签 使用错误,最常见的而且编译器不会提示的错误就是 android:name 和android:id 两者 ...

  4. python模块调用

    1.某个模块1被调用到另一个模块2的时候,当不想模块1中的某些代码在模块2中执行时,可以在模块一种添加如下代码: if    __name__  ==     "__main__" ...

  5. dotnet use regex two samples

    One sample is used to replace double quote from words which encapsulated by csvwriter , you know csv ...

  6. PHP用Array模拟枚举

    C#中枚举Enum的写法: /// <summary> /// 公开类型 2-好友可见 1-公开 0-不公开 /// </summary> public enum OpenSt ...

  7. 理解Linux系统负荷&lbrack;转&rsqb;

    一.查看系统负荷 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行).(另外,它们在苹果公司的Mac电脑上也适用.)   二.一个类比 我们不妨把这个CPU想象成一座大桥, ...

  8. dynamic关键字

    public class TestClass { public dynamic Values { get; set; } } public class Test { static void Func( ...

  9. mysql优化&lpar;2&rpar; 观察mysql进程状态

    环境准备,安装sysbench wget http://nchc.dl.sourceforge.net/project/sysbench/sysbench/0.4.12/sysbench-0.4.12 ...

  10. mxGraph进阶&lpar;一&rpar;mxGraph教程-开发入门指南

    mxGraph教程-开发入门指南 概述 mxGraph是一个JS绘图组件适用于需要在网页中设计/编辑Workflow/BPM流程图.图表.网络图和普通图形的Web应用程序.mxgraph下载包中包括用 ...