mybatis 的SQL日志级别调整方法

问题描述

在 Spring Cloud 项目中,生产环境需要打印mybatis的sql语句日志,但是mybatis打印的sql的默认日志级别是[debug],如果生产环境想看到sql语句,就必须开启[debug]级别的日志打印,这样做debug日志量过大,显然不可行。

如下绿色方案是我抄来的,但在我工程里没生效,最后我自己尝试在此基础上新研究的蓝色方法

解决思路

  • Spring Boot 中通过logback打印 mybatis的sql语句日志,并自定义日志输出实现
  • 将sql语句[debug]日志级别上升到[info]日志级别

解决方案

1. 常用的mybatis 日志输出是由org.apache.ibatis.logging.stdout.StdOutImpl控制的

根据StdOutImpl.java可看出日志都是System.out.println(s);的控制台输出,配置及源码如下:

application.xml配置:
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出日志
StdOutImpl .java源码如下:
public class StdOutImpl implements Log {

  public StdOutImpl(String clazz) {
    // Do Nothing
  }

  @Override
  public boolean isDebugEnabled() {
    return true;
  }

  @Override
  public boolean isTraceEnabled() {
    return true;
  }

  @Override
  public void error(String s, Throwable e) {
    System.err.println(s);
    e.printStackTrace(System.err);
  }

  @Override
  public void error(String s) {
    System.err.println(s);
  }

  @Override
  public void debug(String s) {
    System.out.println(s);
  }

  @Override
  public void trace(String s) {
    System.out.println(s);
  }

  @Override
  public void warn(String s) {
    System.out.println(s);
  }
}
2. 要想改变mybatis sql语句输出内容级别,则只需自定义Log实现类,重写mybatis sql打印方式及级别。代码如下
application.xml
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    log-impl: com.***.***.MySlf4jImpl # mybatis自定义日志输出实现类 并将[debug]日志输出成[info]日志
MySlf4jImpl.java

@Slf4j
public class MySlf4jImpl implements Log {

    public MySlf4jImpl(String clazz) {
        // Do Nothing
    }

    @Override
    public boolean isDebugEnabled() {
        // return log.isDebugEnabled();
        // 将debug级别输出权限改成info级别
        return log.isInfoEnabled();

    }
    ...

    @Override
    public void debug(String s) {
        // log.debug(s);
        // debug日志输出成info级别日志
        log.info(s);
    }
    ...
}
3. 指定logback的日志级别为info,也可在[info]级别日志中查看mybatis 的 sql语句。
logback.xml
<!-- 日志输出级别 -->
<root level="info">
    <appender-ref ref="FILE-INFO"/>
</root>

<!-- 如果想将mybatis-sql[info]日志单独输出到一个文件中,就加上如下配置 -->
<!-- <logger name="com.jiafupeng.util.MySlf4jImpl" level="info" additivity="false">-->
<!-- <appender-ref ref="FILE-SQL"/>-->
<!-- </logger>-->

蓝色方案:

对如上方案稍加修改:

概述:

由于我工程里用的是多数据源,在整合mybatis时,每个数据源的注册类都自行扫描mapper接口和**Mapper.xml文件,所以我将application.yml中增加的关于mybatis的相关配置恢复到修改前的状态,然后在resource的对应mapper目录中加入mybatis-config.xml,并且在注册数据源中将此文件注册进去,并且在mybatis-config.xml中加入相应配置后,mybatis的SQL日志就以INFO的方式打印出来了。

方案详述如下:
1. 将application.yml中增加的关于mybatis的相关配置恢复到修改前的状态

        注意,如果您的工程是单数据源,直接留用application.yml中增加的关于mybatis的相关配置即可。

2. 在resource/mapper/下适当的位置增加mybatis当前数据源的全局配置文件mybatis-config.xml

        如果您工程里已有此文件,请忽略此操作。

3. 在数据源注册类中增加mybatis-config.xml对应描述代码

        如果您工程里已有此文件,请忽略此操作。

@Data
@Configuration
@MapperScan(basePackages = MyDruidDatasrouceConfig.PACKAGE, sqlSessionFactoryRef = "mySqlSessionFactory")
@Slf4j
public class MyDruidDatasrouceConfig  {
    ......

    static final String CONFIG_LOCATION = "classpath:mapper/mybatis-config.xml";
   
    ......

    @Primary
    @Bean(name = "myDruidDatasrouceConfig  ")
    public SqlSessionFactory mySqlSessionFactory(@Qualifier("myDruidDataSource") DataSource myDataSource) throws Exception {

       ......

        sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource(CONFIG_LOCATION));

        return sessionFactory.getObject();
    }
4. 在mybatis-config.xml中增加如下配置:

        直接将日志实现类加到mybatis-config.xml配置里即可。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        ......
        <setting name="logImpl" value="com.***.***.MySlf4jImpl"/>
        ......
    </settings>

</configuration>

至此,齐活儿!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis 框架提供了一些工具来打印生成的 SQL 语句,以帮助调试和优化。以下是几种常用的方法: 1. 在配置文件启用日志:在 MyBatis 的配置文件(通常是 `mybatis-config.xml`),可以配置日志实现来输出 SQL 语句。例如,可以使用 Log4j、Log4j2、Slf4j 等日志框架来记录 SQL 语句。 ```xml <configuration> <!-- 其他配置 --> <settings> <setting name="logImpl" value="LOGGING_FRAMEWORK" /> </settings> </configuration> ``` 将 `LOGGING_FRAMEWORK` 替换为你所使用的日志框架,例如 `LOG4J`、`LOG4J2`、`SLF4J` 等。 2. 使用 `LogFactory` 打印 SQL:在代码,可以使用 `LogFactory` 获取一个 `Log` 对象,并通过调用 `debug()`、`info()`、`error()` 等方法来输出 SQL 语句。 ```java import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; public class MyMapper { private static final Log log = LogFactory.getLog(MyMapper.class); public void myMethod() { // 打印 SQL log.debug("SELECT * FROM my_table"); // 其他代码 } } ``` 通过调整日志级别,你可以决定是否要输出 SQL 语句。 3. 使用第三方插件:除了上述方法,还有一些第三方插件可以用于打印 MyBatisSQL 语句。例如,`MyBatis-Plus` 提供了一个 `SqlInterceptor` 拦截器,可以用于打印 SQL 语句。你可以查阅相关插件的文档以了解更多信息。 这些方法都可以帮助你在开发过程打印 MyBatis 生成的 SQL 语句,方便调试和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值