前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot中 使用[info]日志级别打印mybatis sql语句

SpringBoot中 使用[info]日志级别打印mybatis sql语句

作者头像
夹胡碰
发布2020-08-14 16:31:28
16.4K0
发布2020-08-14 16:31:28
举报
文章被收录于专栏:程序猿~程序猿~

问题描述

在 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
代码语言:javascript
复制
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出日志
StdOutImpl .java
代码语言:javascript
复制
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
代码语言:javascript
复制
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    log-impl: com.jiafupeng.util.MySlf4jImpl # mybatis自定义日志输出实现类 并将[debug]日志输出成[info]日志
MySlf4jImpl.java
代码语言:javascript
复制
/**
 * @author jiafupeng
 * @create 2020/5/26 13:31
 * @desc   自定义mybatis打印sql实现类
 *         将debug日志输出成info日志 对sql进行
 **/
@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
代码语言:javascript
复制
<!-- 日志输出级别 -->
<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>-->
4. 结果验证

image.png

拓展

  1. mybatis sql 打印实现类有很多种,查看实现类源码即可知实现方式,本文使用自定义实现方式,也可使用现有实现类根据项目灵活配置。

image.png

  1. 生产环境如果不想打印mybatis sql 则注释掉打印实现类即可,或者使用NoLoggingImpl.java作为实现类,具体看源码。
代码语言:javascript
复制
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml

代码语言:javascript
复制
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # 无日志(默认有debug日志)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 解决思路
  • 解决方案
    • 1. 常用的mybatis 日志输出是由org.apache.ibatis.logging.stdout.StdOutImpl控制的
      • application.xml
      • StdOutImpl .java
    • 2. 要想改变mybatis sql语句输出内容级别,则只需自定义Log实现类,重写mybatis sql打印方式及级别。代码如下
      • application.xml
      • MySlf4jImpl.java
    • 3. 指定logback的日志级别为info,也可在[info]级别日志中查看mybatis 的 sql语句。
      • logback.xml
    • 4. 结果验证
    • 拓展
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档