SpringBoot系列之日志框架介绍及其原理简介

SpringBoot系列之日志框架介绍及其原理简介html

一、经常使用日志框架简介

市面上经常使用日志框架:JUL、JCL、jboss-logging、logback、log4j、log4j二、slf4j、etc.java

其中日志门面,也是一系列接口api的有slf4j(Simple Logging Facade for Java)、JCL(Jakarta Commons Logging)、jboss-logginspring

注意:经常使用的slf4j等只是一日志门面,是一个日志的抽象层,非日志实现,具体的实现用经过log4j或者logback等框架去实现api

二、在项目中使用slf4j

日志调用的,仍是建议引入slf4j对应的jar和其实现框架log4j或者logback,而后调用的仍是以下进行调用,配好日志实现框架的配置,就能够进行日志跟踪springboot

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

slf官方手册:slf4j官方手册连接框架

如图来自slf4j官方的图,图例已经很好的介绍了slf4j的使用场景:maven

  • 如左一图示,直接导slf4j API工程是不能实现日志打印的
  • logback的使用,须要导入slf4j API工程和其实现logback-classic.jar、logback-core.jar
  • log4j的使用,一样导入slf4j API工程,还要再加比较关键的适配层jar:slf4j-log412.jar,而后log4j.jar才能适配slf4j
  • JTL(java util logging)也是经过适配层的slf4j-jdk14.jar先进行适配,而后jtl框架才能正常实现slf4j的api
  • etc.
    在这里插入图片描述spring-boot

    三、系统日志统一到slf4j

    ok,学到这里应该有个疑问?在Spring项目中,好比Spring framework框架,Hibernate etc.,这些框架是否有本身的日志实现,很显示,基本每一个框架都有本身的日志实现,好比,spring framework就是使用commons-logging进行日志打印的,而Hibernate是经过(jboss-logging)的,etc.,因此这么一堆日志框架堆在一个项目中,是否能够实现统一的日志打印?好比统一到实现slf4j门面学习

在slf4j官网:http://www.slf4j.org/legacy.html,这个页面已经提供了比较合理的兼容统一实现
如官网的图例所示,主要提供引入一些桥接的jar,好比JCL框架能够引入jcl-over-slf4j.jar
log4j能够引入log4j-over-slf4j.net

官方说法:
为了简化从JCL到SLF4J的迁移,SLF4J发行版包括jar文件jcl-over-slf4j.jar。该jar文件旨在替代JCL

注意问题:
jcl-slf4j.jar,这个jar须要注意了,使用过程不要和jcl-over-slf4j一块儿用

jcl-over-slf4j.jar不该与slf4j-jcl.jar混淆
JCL-over-SLF4J(即jcl-over-slf4j.jar)在出于向后兼容性缘由而须要支持JCL的状况下很是有用。它能够用于解决与JCL相关的问题,而没必要采用SLF4J API,该决定能够推迟到之后。
另外一方面,在为组件采用SLF4J API 以后,slf4j-jcl.jar颇有用 ,该组件须要嵌入在正式要求JCL的更大的应用程序环境中。您的软件组件仍可使用SLF4J API,而不会破坏大型应用程序。实际上,slf4j-jcl.jar会将全部日志记录决策委派给JCL,以便您的组件对SLF4J API的依赖关系对于更大的总体而言是透明的。
请注意,不能同时部署jcl-over-slf4j.jar和 slf4j-jcl.jar。前一个jar文件将使JCL将日志记录系统的选择委派给SLF4J,后一个jar文件将使SLF4J将日志记录系统的选择委派给JCL,从而致使无限循环。

ok,对于log4j-over-slf4j.jar使用过程一样注意

log4j-over-slf4j.jar和slf4j-log4j12.jar不能同时存在
slf4j-log4j12.jar的存在(即SLF4J的log4j绑定)将强制将全部SLF4J调用委派给log4j。log4j-over-slf4j.jar的存在将把全部log4j API调用委派给它们的SLF4J等效项。若是二者同时存在,则slf4j调用将委派给log4j,而log4j调用将重定向到SLF4j,从而致使无限循环。

在这里插入图片描述
对于这些居然的jar是如何实现偷梁换柱的?咱们能够点开对应的jar,如图所示:这个jar的包名命名都和jcl的同样,目的是实现偷梁换柱,强制不使用jcl的api,而实现slf4j
在这里插入图片描述

在这里插入图片描述
ok,能够概括统一项目使用slf4j的过程,首先系统仍是用排除其它日志实现jar,而后引入桥接的jar,等覆盖了以后,就能够加上对应的实现jar包,实现日志打印

四、Springboot日志场景启动器

ok,有了前面的知识后,咱们能够继续学习Springboot的日志实现了,从前面的知识能够知道,slf4j只是一个日志门面工程,并不是实现,在不少项目里都有日志框架混用的状况,针对此种起来,能够加入一些桥接的偷梁换柱jar,而后再加上对应的实现jar就能够

而后Springboot其实也是相似这种实现,首先,Springboot默认使用slf4j做为门面工程,在实现过程也是有用这些偷梁换柱的桥接jar进行slf4j统一,而后再引用logback做为日志实现的jar,先快速建立一个Springboot项目:Springboot系列之快速建立项目教程

建立好项目以后,是默认会引入日志框架的,首先在pom文件,右键->maven->show dependencies显示jar依赖图

如图所示,Springboot的场景启动项目spring-boot-strater集成了spring-boot-strater-logging,spring-boot-strater-logging都是以logback为默认的日志实现框架,固然本博客是以Springboot2.2.1.RELEASE版本为例子的
在这里插入图片描述
固然每一个版本的实现略有不一样,不过基本都一致,给出尚硅谷老师给的图片:
在这里插入图片描述
ok,Springboot项目已经对日志作了一个比较好的兼容,还有一个日志jar冲突问题须要注意,由于Springboot项目是统一为slf4j门面的,很显然Springboot在项目实现中就已经作了其它日志jar门面的排除,好比spring项目就已经将jcljar排除了,如图:
在这里插入图片描述

因此,在项目使用中,引入其它的jar,都要考虑是否有对应的日志实现jar,要作必要的排除,以避免形成jar冲突

ok,这篇博客是对经常使用日志框架的介绍,有了这些必要的知识以后,就能够实践一下了,详情的能够参数个人博客,SpringBoot系列日志框架使用教程

相关文章
相关标签/搜索