- 项目背景,springboot工程,用mybatis-plus 做orm框架,nacos获取配置。
- 需求场景:IM项目,需要动态控制sql语句的输出,平时不用输出sql,以免影响性能。如果有异常或者需求需要排查,才输出sql好方便排查问题。
解决: 一般配置输出sql语句,如下配置即可
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
将最后一项log-impl对应的类替换成自己的实现的一个类。如下所示
mybatis-plus:
configuration:
log-impl: com.kuailu.im.server.config.MybatisPlusOutImpl
MybatisPlusOutImpl 是自己实现的一个类,用log4j做日志输出框架。具体代码如下:
@Slf4j
public class MybatisPlusOutImpl implements Log {
public MybatisPlusOutImpl(String clazz) {
log.info(clazz);
}
public boolean isDebugEnabled() {
return true;
}
public boolean isTraceEnabled() {
return true;
}
public void error(String s, Throwable e) {
log.info(s);
e.printStackTrace(System.err);
}
public void error(String s) {
log.info(s);
}
public void debug(String s) {
log.info(s);
}
public void trace(String s) {
log.info(s);
}
public void warn(String s) {
log.info(s);
}
}
这样便将输出sql语句,转为由自定义的类输出。由于该项目已经添加了springboot的actuator。在bootstrap.yml中打开actuator日志的端点:
# 而日志控制需要用到 /loggers 端点,故而需要设置将其暴露。
当然把loggers替换成*也是可以的;开启所有!
management:
endpoints:
web:
exposure:
include: 'loggers'
# include: *
然后通过调用url如,发送post请求:
https://localhost:6689/actuator/loggers/com.kuailu.im.server.config.MybatisPlusOutImpl
传参:{"configuredLevel":"error"}
最后传参即MybatisPlusOutImpl的全路径,configuredLevel即将该类的日志级别改为error。这样便不再输出sql语句。待需要输出sql语句时,用同样的方法,传参configuredLevel为info。便又恢复输出sql语句。
打开actuator日志的端点有安全风险,最好做好安全校验。还可以结合springboot的admin模块,直接用界面来控制sql的输出与否。如下所示。在线将MybatisPlusOutImpl基本设置为error。则不再输出sql。点击INFO,则又可以输出sql语句。