問題描述
在 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
拓展
-
mybatis sql 打印實現(xiàn)類有很多種,查看實現(xiàn)類源碼即可知實現(xiàn)方式,本文使用自定義實現(xiàn)方式,也可使用現(xiàn)有實現(xiàn)類根據(jù)項目靈活配置。
image.png
- 生產環(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日志)
