美文网首页
SQL自定义日志输出

SQL自定义日志输出

作者: kacen | 来源:发表于2022-07-03 14:40 被阅读0次
    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

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

    相关文章

      网友评论

          本文标题:SQL自定义日志输出

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