打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SpringBoot统一日志框架

在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析。在Java领域里存在着多种日志框架,如JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback等等。  

日志框架的选择  

市面上常见的日志框架有很多,它们可以被分为两类:日志门面(日志抽象层)和日志实现,如下表。  

日志分类描述举例
日志门面(日志抽象层)为 Java 日志访问提供一套标准和规范的 API 框架,其主要意义在于提供接口。JCL(Jakarta Commons Logging)、SLF4j(Simple Logging Facade for Java)、jboss-logging
日志实现日志门面的具体的实现Log4j、JUL(java.util.logging)、Log4j2、Logback

通常情况下,日志由一个日志门面与一个日志实现组合搭建而成,SpringBoot选用SLF4J+Logback的组合来搭建日志系统。  

SLF4J是目前市面上最流行的日志门面,使用Slf4j可以很灵活的使用占位符进行参数占位,简化代码,拥有更好的可读性。  

Logback是Slf4j的原生实现框架,它与Log4j出自一个人之手,但拥有比log4j更多的优点、特性和更做强的性能,现在基本都用来代替log4j成为主流。  

SLF4J的使用  

在项目开发中,记录日志时不应该直接调用日志实现层的方法,而应该调用日志门面(日志抽象层)的方法。  

在使用SLF4J记录日志时,我们需要在应用中导入SLF4J及日志实现,并在记录日志时调用SLF4J的方法,例如:  

import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HelloWorld { public static void main(String[] args) {
  Logger logger = LoggerFactory.getLogger(HelloWorld.class); //调用 sl4j 的 info() 方法,而非调用 logback 的方法
  logger.info("Hello World");
 }
}12345678910复制代码类型:[java]

SLF4J作为一款优秀的日志门面或者日志抽象层,它可以与各种日志实现框架组合使用,以达到记录日志的目的,如下图。  

从SLF4J官方给出的方案可以看出:  

Logback作为Slf4j的原生实现框架,当应用使用SLF4J+Logback的组合记录日志时,只需要引入SLF4J和Logback的Jar包即可;  

Log4j虽然与Logback出自同一个人之手,但是Log4j出现要早于SLF4J,因而Log4j没有直接实现SLF4J,当应用使用SLF4J+Log4j的组合记录日志时,不但需要引入SLF4J和Log4j的Jar包,还必须引入它们之间的适配层(Adaptationlayer)slf4j-log4j12.jar,该适配层可谓“上有老下有小”,它既要实现SLF4J的方法,还有调用Log4j的方法,以达到承上启下的作用;  

当应用使用SLF4J+JUL记录日志时,与SLF4J+Log4j一样,不但需要引入SLF4J和JUL的对应的Jar包,还要引入适配层slf4j-jdk14.jar。  

这里我们需要注意一点,每一个日志的实现框架都有自己的配置文件。使用slf4j记录日志时,配置文件应该使用日志实现框架(例如logback、log4j和JUL等等)自己本身的配置文件。  

统一日志框架(通用)  

通常一个完整的应用下会依赖于多种不同的框架,而且它们记录日志使用的日志框架也不尽相同,例如,SpringBoot(slf4j+logback),Spring(commons-logging)、Hibernate(jboss-logging)等等。那么如何统一日志框架的使用呢?  

对此,SLF4J官方也给出了相应的解决方案,如下图。  

从上图中可以看出,统一日志框架一共需要以下3步:  

1、排除应用中的原来的日志框架;  

2、引入替换包替换被排除的日志框架;  

3、导入SLF4J实现。  

SLF4J官方给出的统一日志框架的方案是“狸猫换太子”,即使用一个替换包来替换原来的日志框架,例如log4j-over-slf4j替换Log4j(CommonsLoggingAPI)、jul-to-slf4j.jar替换JUL(java.util.loggingAPI)等等。  

替换包内包含被替换的日志框架中的所有类,这样就可以保证应用不会报错,但替换包内部实际使用的是SLF4JAPI,以达到统一日主框架的目的。  

统一日志框架(SpringBoot)  

我们在使用SpringBoot时,同样可能用到其他的框架,例如Mybatis、SpringMVC、Hibernate等等,这些框架的底层都有自己的日志框架,此时我们也需要对日志框架进行统一。  

我们知道,统一日志框架的使用一共分为3步,SoringBoot作为一款优秀的开箱即用的框架,已经为用户完成了其中2步:引入替换包和导入SLF4J实现。  

SpringBoot的核心启动器spring-boot-starter引入了spring-boot-starter-logging,使用IDEA查看其依赖关系,如下图。  

从图3可知,spring-boot-starter-logging的Maven依赖不但引入了logback-classic(包含了日志框架SLF4J的实现),还引入了log4j-to-slf4j(log4j的替换包),jul-to-slf4j(JUL的替换包),即SpringBoot已经为我们完成了统一日志框架的3个步骤中的2步。  

SpringBoot底层使用slf4j+logback的方式记录日志,当我们引入了依赖了其他日志框架的第三方框架(例如Hibernate)时,只需要把这个框架所依赖的日志框架排除,即可实现日志框架的统一,示例代码如下。  

<dependency>
 <groupId>org.apache.activemq</groupId>
 <artifactId>activemq-console</artifactId>
 <version>${activemq.version}</version>
 <exclusions>
  <exclusion>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
  </exclusion>
 </exclusions>
</dependency>
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Spring Boot 日志
Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结
全网最全 Java 日志框架适配方案!还有谁不会?
Java平台下日志的那些事
SpringBoot里slf4j日志功能的默认实现
3.Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服