美文网首页JAVA框架程序员
SpringBoot中 使用[info]日志级别打印mybati

SpringBoot中 使用[info]日志级别打印mybati

作者: 夹胡碰 | 来源:发表于2020-05-26 17:08 被阅读0次

    问题描述

    在 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.jiafupeng.util.MySlf4jImpl # mybatis自定义日志输出实现类 并将[debug]日志输出成[info]日志
    
    MySlf4jImpl.java
    /**
     * @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
    <!-- 日志输出级别 -->
    <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作为实现类,具体看源码。
    mybatis:
      type-aliases-package: com.jiafupeng.mapper
      mapper-locations: classpath:mapper/**/*.xml
    

    mybatis:
      type-aliases-package: com.jiafupeng.mapper
      mapper-locations: classpath:mapper/**/*.xml
      configuration:
        log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # 无日志(默认有debug日志)
    

    相关文章

      网友评论

        本文标题:SpringBoot中 使用[info]日志级别打印mybati

        本文链接:https://www.haomeiwen.com/subject/fudvahtx.html