mybatis开启log_mybatis打印sql⽇志
查看mybatis源码,mybatis内部封装了⽇志接⼝,可以对接当前留下的所有的⽇志实现html是java语言吗
在实际开发过程中或者⽣产环境查定位问题,需要查看执⾏的sql语句,以下详细说明下如何将sql⽇志打印出来
我们借助问题的⽅式进⾏分析
为什么我的项⽬中直接将根⽬录(root)⽇志级别调整为DEBUG,就可以输出sql⽇志,调⾼级别就打印不出来了呢
直接贴源码
为什么项⽬是DEBUG级别,但是还是不能输出sql⽇志呢
先贴源码
mysql语句的执行顺序看源码可以看出,mybatis是按照顺序 slf4j->commonsLog->log4j2->log4j->jdkLog->noLog(空实现),这个顺序尝试加载⽇志实现的,
可能本地有多中⽇志实现,⽽项⽬中的⽇志实现与mybatis加载的⽇志实现不同导致的,排除⽆⽤的⽇志实现既可,或者⾼版本mybatis(⾼于3.2.0的版本)可以直接设置mybatis的⽇志实现
不想调整root的⽇志级别,可以只打印mybatis的⽇志吗
调整root节点的⽇志级别,会打印出其他jar包的⽇志,影响我们查看问题
可以直接跳转mybatis⽇志级别实现打印sql⽇志的需求
调整mybatis⽇志级别及⽇志实现
⾼版本(版本⾼于3.2.0)mybatis设置⽇志实现
MyBatis 配置⽂件
MyBatis api写法
Configuration configuration = new Configuration();
//
configuration.setLogPrefix("dao.");
// 实现了Log接⼝的实现类即可
tensorflow张量拆分configuration.setLogImpl(Log4j2Impl.class);
低版本(版本低于3.2.0)mybatis设置⽇志级别
// stdout 打印在控制台,可以知道输出到⽂件
//根⽬录设置为info,避免其他jar包⽇志输出
由于mybatis⽇志打印是使⽤jdk代理实现的,如果⽇志级为DEBUG,会⾛代理类打印⽇志,其他级别会⾛原⽆⽇志逻辑,且
java.sql.Connection是开启代理⽇志的⼊⼝,所有java.sql.Connection必须设置为DEBUG级别
源码-org.utor.BaseExecutor#getConnection:
dtd硫酸乙烯酯protected Connection getConnection(Log statementLog) throws SQLException {
Connection connection = Connection();
//ConnectionLogger为⽇志的代理类
return statementLog.isDebugEnabled() ?
}
有兴趣可以查看相关⽇志代理类ConnectionLogger/PreparedStatementLogger/ResultSetLogger
⾼版本(版本⾼于3.2.0)mybatis设置⽇志级别
⾼版本指定mapper中的⽅法打印⽇志
由于Log4j中的log的继承关系,配置mapper的上层包路径的⽇志级别也可以打印⽇志,⽐如ample.log.mapper或linux系统界面卡住不动
未配置logPrefix的demo
配置logPrefix的demo,logPrefix=dao
总结
mybatis低版本⽇志打印存在缺点: 当开启打印SQL⽇志后,会打印所有正在执⾏的SQL语句,不能实现针对特定SQL的打印,基于此MyBatis 从3.2.0版本之后重新实现了相关功能
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论