干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结

Posted 职坐标在线

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结相关的知识,希望对你有一定的参考价值。




干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结
干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


几乎任何应用,一定是需要日志的。

那么,面对种类繁多的日志框架和配置,我们该何去何从?















前奏

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


大家想必都是在研究mybatis源码的过程中才意识到需要搞明白日志原理这回事,因为mybatis(和一些其他开源框架,比如rocketmq)都有自己的日志系统,他们在框架内部都使用的是自己的日志API,那么,为什么他们不像我们平常那样配置一个log4j呢?


根本原因不太清楚,但猜测可能有这么一些理由,这些框架比较老,当初还没有slf4j这种事实上的标准,另一方面,有一些特殊的定制化的日志。


彻底研究清楚mybatis的日志系统之后,其实这一块设计得不太好,至少今天看来,不太优雅,因为本来一个slf4j就能搞定所有,非得在源码中加入自己的org.apache.ibatis.logging这个包,里面包含一些适配器,虽然代码并不复杂,但是有点多此一举。


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结



原理

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


slf4j是标准,也是门面,他对用户提供统一的API,而下方对接各个日志框架。这有点类似JVM,我们Java开发者使用统一的API,而JVM对接各个操作系统。严格意义上说slf4j自身并不提供日志具体实现。


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结



slf4j采用的是SPI机制

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


指定一个标准的目录结构:org.slf4j.impl.StaticLoggerBinder,然第三方的框架都必须存在一个这样的类,用于和slf4j建立关系,比如slf4j-simple.jar,logback,这两个直接实现了slf4j的接口,而对于log4j这种则需要一个中间适配器slf4j-log4j12。于是乎,当调用slf4j的Logger logger = 


LoggerFactory.getLogger(XXX.class)的时候,虽然使用的是slf4j的api,但是真正输出日志的是具体的日志框架,这样子做的好处就是,当某一天你希望更换日志框架了,只需要把具体日志框架的jar包替换掉,不需要更改任何一行代码,就能实现日志框架的切换。


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结



slf4j是如何发现具体日志框架的

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


这就得意于spi机制,前面说每个日志框架都需要存在一个org.slf4j.impl.StaticLoggerBinder类,log4j则是通过中间适配器slf4j-log4j12。


当调用LoggerFactory.getLogger的时候,就会去classpath中寻找StaticLoggerBinder这个类,如果不存在或者存在超过1个,那么会报错,classpath有且只能存在一个StaticLoggerBinder类。


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结



分析mybatis的日志框架

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


mybatis有一套属于自己的日志系统,日志api是:Log log = LogFactory.getLog(xxx.class),于此同时,封装了几个主流的日志框架适配器,包括:SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING,当调用Log log =LogFactory.getLog(xxx.class)时


会初始化众多适配器中的一个,可以在mybatis的配置文件中通过logImpl指定具体的一个,如果不指定那么默认使用SLF4J,因为这里在LogFactory类中的静态代码快第一个就是SLF4J:


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


假设使用默认配置,那么就会初始化Slf4jImpl类,这个类内部有个代理log,这个代理log就是Logger logger =LoggerFactory.getLogger(clazz),这就回归到slf4j的标准使用方式上面来了,mybatis打印日志,其实就是代理对象在打印,而代理对象就是classpath中配置的具体日志框架。



分析log4j是如何与slf4j整合的

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


前面说到,要使用log4j就必须引入slf4j-log4j12这个jar包,而这个jar包中同样存在一个StaticLoggerBinder类,当我们调用LoggerFactory.getLogger(clazz)的时候,同样是初始化StaticLoggerBinder,然后调用利用ILoggerFactory创建一个log4j的Logger实例,代码如下:


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


最关键的一行就是第27行Logger newInstance = new Log4jLoggerAdapter(log4jLogger),slf4j的Logger对象实际上是一个log4j的适配器对象(也是代理对象),当slf4j调用比如debug方法的时候,实际上是代理对象(也就是真实的log4j对象)在调用debug方法。


人工智能物联网班火热招生中


我们的课程从入门到实战项目,让你快速掌握企业所需前沿技术,职坐标助你在6个月挑战高薪入职。



干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结



往期精彩回顾


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结

职坐标在线 一个有用的公众号
干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结
干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结
长按,识别二维码,加关注

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结

干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结 干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结


“阅读原文”一起来充电吧!
我就知道你在看

以上是关于干货 | 关于JS的小知识,Slf4j,Log4J,Logback原理总结的主要内容,如果未能解决你的问题,请参考以下文章

slf4j 搭配 log4j2 处理日志

Java日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)

关于slf4j log4j log4j2的jar包配合使用的那些事

关于slf4j不能输出日志到文件,怎么解决

关于slf4j不能输出日志到文件,怎么解决

slf4j+log4j2模式的日志搭建