mybatis 打印sql日志

mybatis 打印sql日志,第1张

查看mybatis源码,mybatis内部封装了日志接口,可以对接当前留下的所有的日志实现

在实际开发过程中或者生产环境查找定位问题,需要查看执行的sql语句,以下详细说明下如何将sql日志打印出来

直接贴源码

先贴源码

看源码可以看出,mybatis是按照顺序 slf4j->commonsLog->log4j2->log4j->jdkLog->noLog(空实现),这个顺序尝试加载日志实现的,

可能本地有多中日志实现,而项目中的日志实现与mybatis加载的日志实现不同导致的,排除无用的日志实现既可,或者高版本mybatis(高于3.2.0的版本)可以直接设置mybatis的日志实现

调整root节点的日志级别,会打印出其他jar包的日志,影响我们查看问题

可以直接跳转mybatis日志级别实现打印sql日志的需求

由于mybatis日志打印是使用jdk代理实现的,如果日志级为DEBUG,会走代理类打印日志,其他级别会走原无日志逻辑,且java.sql.Connection是开启代理日志的入口,所有java.sql.Connection必须设置为DEBUG级别

由于Log4j中的log的继承关系,配置mapper的上层包路径的日志级别也可以打印日志,比如com.example.log.mapper或com.example.log.mapper.UserMapper

mybatis低版本日志打印存在缺点: 当开启打印SQL日志后,会打印所有正在执行的SQL语句,不能实现针对特定SQL的打印,基于此 MyBatis 从3.2.0版本之后重新实现了相关功能

mybatis默认使用log4j,当有self4j这个日志jar包存在时会无法打印sql,请移除或者在工程启动时显示设置mybatis使用的日志类:

log4j.logger.org.apache.ibatis=debug,stdout log4j.logger.java.sql=debug,stdout

这样有时可能却不是个可行的办法,原因在于不可能移除self4j包,因为其他依赖包必须依赖这个包。 mybatis有如下方法来手动选择日志类,调用后成功打印日志 如果引用了slf4j的包,并且要使用log4j需要加入slf4j-log4j12的包,如果没有加入slf4j-log4j12的包是无法打印sql的。。具体log4j文件如下:

log4j.rootCategory=info, stdout , R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.Conversion

Pattern=[QC] %p [%t] %C.%M(%L) | %m%n

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

log4j.appender.R.File=D:\\report.log

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n

log4j.logger.com.ibatis=debug

log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug

log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug

log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug

log4j.logger.java.sql.Connection=debug

log4j.logger.java.sql.Statement=debug

log4j.logger.java.sql.PreparedStatement=debug,stdout

现在重启tomcat,执行一条语句看看,sql是不是都出来了

<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!-- 当发生滚动时 TimeBasedRollingPolicy滚动策略 根据时间来制定滚动策略 -->

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!-- 按天回滚 daily -->

<!-- local

<fileNamePattern>/Users/liyixiang/Documents/logs/xxx-xxx-${appPort}-%d{-MM-dd}.log</fileNamePattern>

-->

<!-- log.dir 在maven profile里配置 -->

<fileNamePattern>/logs/xxx-xxx-${appPort}-%d{-MM-dd}.log</fileNamePattern>

<!-- 控制保留的归档文件的最大数量 日志最大的历史 5天 -->

<maxHistory>5</maxHistory>

</rollingPolicy>

<!-- 日志格式化 -->

<encoder>

<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%msg]%n</pattern>

</encoder>

<p>

</appender>

</p>

<p>

<br>

</p>

<p>

</p><pre class="brush:xmltoolbar: trueauto-links: false">具体的pattern可以查询logback pattern like this --></pre>

<p></p>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8115649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存