SpringBoot中 使用[info]日志級別打印mybatis sql語句

問題描述

在 Spring Cloud 項目中,生產環(huán)境需要打印mybatis的sql語句日志,但是mybatis打印的sql的默認日志級別是[debug],如果生產環(huán)境想看到sql語句,就必須開啟[debug]級別的日志打印,這樣做debug日志量過大,顯然不可行。

解決思路

  • Spring Boot 中通過logback打印 mybatis的sql語句日志,并自定義日志輸出實現(xiàn)
  • 將sql語句[debug]日志級別上升到[info]日志級別

解決方案

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

根據(jù)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實現(xiàn)類,重寫mybatis sql打印方式及級別。代碼如下

application.xml
mybatis:
  type-aliases-package: com.jiafupeng.mapper
  mapper-locations: classpath:mapper/**/*.xml
  configuration:
    log-impl: com.jiafupeng.util.MySlf4jImpl # mybatis自定義日志輸出實現(xiàn)類 并將[debug]日志輸出成[info]日志
MySlf4jImpl.java
/**
 * @author jiafupeng
 * @create 2020/5/26 13:31
 * @desc   自定義mybatis打印sql實現(xiàn)類
 *         將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 打印實現(xiàn)類有很多種,查看實現(xiàn)類源碼即可知實現(xiàn)方式,本文使用自定義實現(xiàn)方式,也可使用現(xiàn)有實現(xiàn)類根據(jù)項目靈活配置。


    image.png
  1. 生產環(huán)境如果不想打印mybatis sql 則注釋掉打印實現(xiàn)類即可,或者使用NoLoggingImpl.java作為實現(xiàn)類,具體看源碼。
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日志)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容