SQL自定义日志输出

2022-07-03  本文已影响0人  kacen
sql的日志输出还是比较有必要的,后期可以做日志管理,做可视化日志的查看。
下面是query,update的示例。如果需要监听其他类型的,只需要再添加update方法即可(因为主要业务的增删改基本由update来掌控了)

使用前请导入Mybatis相关依赖即可。

Intercepts的拦截位置主要看你需要做什么,这里的话拦截StatmentHandler是因为如果再往下的话就方法就到了excute方法了,所有得在doquery或者update之前就进行拦截。

SQLPlugin.java

@Intercepts(
        @Signature(
                type = StatementHandler.class,//指定拦截器增强的内置对象的类型
                method = "query",//指定内置对象中的方法
                args = {Statement.class, ResultHandler.class}//指定方法中的行参列表
        ),
        @Signature(
                type = StatementHandler.class,//指定拦截器增强的内置对象的类型
                method = "update",//指定内置对象中的方法
                args = {Statement.class}//指定方法中的行参列表
        )
)
@Slf4j
public class SQLPlugin implements Interceptor {

    @Override
    /**
     * 核心的拦截方法,拦截那个内置对象中的哪个方法
     * @param invocation
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 记录当前执行的sql语句 & 记录sql语句执行的耗时
        // 获取拦截的目标对象,因为拦截的就是StatementHandler
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        // 获取sql语句,还要格式化一下才能正常输出
        String sql = statementHandler.getBoundSql().getSql().toLowerCase().replaceAll("\n","").replaceAll(" ","");
        log.info("[SQL - EXEC] 执行的sql语句:{}", sql);
        // 查询记录耗时
        long begin = System.currentTimeMillis();
        // 执行sql - 放行
        Object result = invocation.proceed();
        long end = System.currentTimeMillis();
        // 这里需要格式化一下
        log.info("[SQL - EXEC] SQL的耗时: {}s", BigDecimal.valueOf(end).subtract(BigDecimal.valueOf(begin)).divide(BigDecimal.valueOf(1000).setScale(6, RoundingMode.DOWN)) );
        // 要返回
        return result;
    }
}

MySQLAutoConfiguration.java

public class MySQLAutoConfiguration {

    //注册MyBatis插件
    @Bean
    //havingValue为true的时候才启动,matchIfMissing如果没找到对应配置就默认关闭
    @ConditionalOnProperty(name = "*.plugin.sql.enable", havingValue = "true", matchIfMissing = false)
    public SQLPlugin getSQLPlugin() {
        return new SQLPlugin();
    }
}

这个的Configuration文件主要是方便我们使用的时候在yml或者properties等文件中可以有提示。

SQLPluginConfiguration.java

@Data
@ConfigurationProperties(prefix = "pbshop.plugin.sql")
public class SQLPluginConfiguration {
    private boolean enable;
}

如果成功配置的情况下是可以在编译文件中产生下面这个文件的。

截屏2022-07-04 下午2.31.53.png

里面是这样的

截屏2022-07-04 下午2.32.57.png

然后再看一下目录,大概是这样

截屏2022-07-04 下午2.35.43.png

最后再配置一下yml或者properties文件来控制它是否启用

截屏2022-07-04 下午2.36.52.png

基本操作都做完了,就结束啦。

上一篇 下一篇

猜你喜欢

热点阅读