SpringBoot打印Mybatis执行SQL及slf4j日志配置

前言

最近在springboot项目的代码问题定位时需要知道mybatis的执行SQL,所以查了下如何配置,并顺道整理下之前一直忽略的日志内容。

1 日志框架介绍

23种设计模式中有一种模式叫门面模式

SpringBoot打印Mybatis执行SQL及slf4j日志配置_第1张图片

在这个结构图中,出现了两个角色:

  • 门面(Facade)角色 : 客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
  • 子系统(SubSystem)角色 : 可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

使用门面模式具有以下优点:

  • 松散耦合: 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
  • 简单易用: 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
  • 更好的划分访问层次: 通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

日志框架也采用门面模式来设计,其中JCL(Jakarta Commons Logging)和SLF4J(Simple Logging Facade for Java)是日志门面,JUL(Java Util Logging)、Log4j、Logback和Log4j2则是日志实现。

参考资料:JCL、SLF4J、Log4J、Log4J2、LogBack和JUL之间的关系,你搞清楚了吗?

1.1 日志门面

日志门面中JCL最后一次更新是在2014年,目前基本都是使用SLF4J日志门面,所以只介绍SLF4J的内容。

1.1.1 SLF4J

SLF4J日志门面可以搭配JUL、Log4j、Logback和Log4j2中任何一个日志实现使用,使用SLF4J门面只需要引入slf4j-api-${project.version}.jar包即可。搭配不同日志实现也是通过在项目中引入对应的jar即可,具体如下:

  • slf4j-simple-${latest.stable.version}.jar:绑定Simple 日志实现,仅仅在很简单的项目中使用。
  • slf4j-nop-${latest.stable.version}.jar:绑定 NOP, 用于丢弃所有日志。
  • slf4j-jdk14-${latest.stable.version}.jar:绑定java.util.logging,即JDK 1.4版本的日志实现。
  • slf4j-log4j12-${latest.stable.version}.jar:绑定log4j 1.2版本的日志实现。
  • logback-classic-logback.version.jar(requireslogback−core−{logback.version}.jar (requires logback-core-logback.version.jar(requireslogback−core−{logback.version}.jar) :绑定logback日志实现。

要切换不同的日志实现,只需要替换不同的日志实现jar包就可以。以下SLF4J官网的图展示了门面和实现的绑定关系。

SpringBoot打印Mybatis执行SQL及slf4j日志配置_第2张图片

SLF4J日志门面绑定日志实现是在编译阶段完成的,而且只能绑定一个日志实现。由于SLF4J门面不依赖任何的类加载机制,所以不存在JCL(Jakarta Commons Logging)日志门面遇到的类加载器或内存泄漏问题。

参考资料:SLF4J user manual

1.2 日志实

你可能感兴趣的:(面试,java,程序人生,后端)