以前做项目数据访问层使用SpringJDBC或MyBatis-SqlSessionTemplate,可以直接log执行的sql语句。
新项目虽使用MyBatis3,但使用MapperScannerConfigurer直接将**Mapper接口类和**Mapper.xml文件关联,
无法直接打印sql日志,有问题时怀疑sql也不好定位,怎么办呢?
流行解决方案
网上大部分教程都是如下配置,1
2
3log4j.logger.com.ibatis=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
需要设置log4j.rootCategory=DEBUG,各个库输出的DEBUG信息太多,完全看不了。可以逐一设置各个库的日志级别,需要查各个库的logger标记,比较麻烦。
官方方案
通过各种查找(不得不吐糟百度太low,想要真资料还得备梯子!),MyBatis的官网有推荐。
Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种方式:
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j
- JDK logging
按上述优先级顺序查找,使用最先找到的。如果一个都未找到,日志功能被禁用。
如果 Commons Logging存在(项目引入了slf4j-jdk**.jar),Log4j就会被忽略。
可以采用配置方式使用Log4j,mybatis-config.xml增加:1
2
3
4
5<configuration>
<settings>
<setting name="logImpl" value="LOG4J"/>
<settings>
</configuration>
其他日志logImpl对应配置:
SLF4J,LOG4J,LOG4J2,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING。
log4j.properties配置文件增加,
- 可使用mapper接口包名或mapper配置文件的命名空间namespace;
- 级别可选TRACE或DEBUG;
- 可指定到某个查询方法。
如,
log4j.logger.com.tt.is.vems.dao.parkoperation=trace
log4j.logger.com.tt.is.vems.dao.parkoperation.selectByQueryParam=debug
问题
设置过程中遇到2个问题,记录如下,
去掉slf4j-jdk14包,即去掉Apache Commons Logging,启动时报如下错,
java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z
定位到是项目引用的包com.emay.client.emay-client里面有一个Logger实现,导致动态加载的Logger错误。日志输出不是完整的sql语句,分3条输出:带占位符sql语句,参数,返回结果条数。具体原因下回揭晓。
selectByQueryParam.debug(139) | ==> Preparing: select * from tb_park_real_time_car WHERE enter_time >= ? and enter_time <= ? order by enter_time DESC limit 0,10
selectByQueryParam.debug(139) | ==> Parameters: 2016-03-08 00:00:00(String), 2016-03-08 23:59:59(String)
selectByQueryParam.debug(139) | <== Total: 0
参考资料
http://blog.csdn.net/isea533/article/details/22931341
http://www.cnblogs.com/jeevan/p/3493972.html
http://www.mybatis.org/mybatis-3/zh/logging.html