使用spring-mybatis进行Spring-boot – 如何强制它记录所有SQL查询

我有一个简单的spring-boot-mybatis应用程序(请记住,请)。 Mybatis仅在发生故障时(在例外情况下)记录SQL查询。 请告诉我,如何强制它将所有SQL查询记录到控制台?

此刻我正在使用slf4j logger(由spring-boot自动配置)。
我找到了这个链接: http : //www.mybatis.org/mybatis-3/logging.html
但是我没有设法遵循它。 首先显示log4j配置,我不确定如果我正确理解:在application.properties配置是否足够?

提前致谢

Spring引导使用logback作为Slf4j的默认日志记录提供程序。 Ibatis内部日志工厂加载SLF4j作为首选记录器。 您所要做的就是配置spring boot logger以发布ibatis映射器的日志消息。

在引导应用程序属性中添加以下行。

 logging.level.org.springframework=WARN logging.level.com.spring.ibatis.UserMapper=DEBUG logging.file=logs/spring-boot-logging.log 

第二行是您使用DEBUG日志级别为ibatis映射器定义日志记录条目的位置。 com.spring.ibatis是包, UserMapper是示例映射器。

以下日志将开始显示在控制台和spring-boot-logging文件中。 这些是从saveUserApplicationTest类的findByName方法生成的日志消息。

 2016-12-19 22:07:06.358 INFO 7248 --- [main] com.spring.ibatis.ApplicationTest : Started ApplicationTest in 3.048 seconds (JVM running for 4.209) 2016-12-19 22:07:06.424 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser : ==> Preparing: insert into users(name) values(?) 2016-12-19 22:07:06.444 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser : ==> Parameters: ibatis(String) 2016-12-19 22:07:06.445 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser : <== Updates: 1 2016-12-19 22:07:06.457 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.findByName : ==> Preparing: select name from users WHERE name=? 2016-12-19 22:07:06.470 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.findByName : ==> Parameters: ibatis(String) 2016-12-19 22:07:06.504 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.findByName : <== Total: 1 

您当然可以配置任何您想要的记录器选项。 如果需要,我可以轻松地为任何其他记录器添加示例。

您可以在https://github.com/saagar2000/ibatis上找到包含Junit测试用例的完整代码

SLF4J不替代log4j,它们一起工作。 它从库/ app中删除了对log4j的依赖。

https://softwareengineering.stackexchange.com/questions/108683/slf4j-vs-log4j-which-one-to-prefer

因此,如果使用slf4j,只要在slf4j下使用log4j,就可以使用log4j配置。

这是我发现的关于将slf4j与log4j logger一起使用的指南: http ://saltnlight5.blogspot.ca/2013/08/how-to-configure-slf4j-with-different.html

基本上,您只需要在此处创建一个属性文件: src/main/resources/log4j.properties并将其配置与链接中的配置相同。 正如你的链接所说:

…为此,SQL语句记录在DEBUG级别(JDK日志记录中为FINE),结果为TRACE级别(JDK日志记录中的FINER)…

因此,请确保在属性文件中设置了log4j.logger.org.mybatis.example=DEBUG

另一种方法是使用代理驱动程序,例如log4jdbc2,其优点是使用与其他答案不同的参数来记录确切的SQL进入数据库。 无论持久性破坏层(例如iBatis,JPA等)如何,这都将起作用。

https://code.google.com/archive/p/log4jdbc-log4j2/

这样做的一个主要方便是您可以将SQL直接复制到数据库前端并按原样执行。

1添加Maven依赖项:

  org.bgee.log4jdbc-log4j2 log4jdbc-log4j2-jdbc4.1 1.16  

2添加Logback配置。 将相关部分复制到现有的logback.xml

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

3告诉log4jdbc2您的日志配置:

在类路径src / test / resources的根目录或Maven项目中的src / main / resources中创建名为log4jdbc.log4j2.properties的文件。 这个文件有一行,如下所示:

log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

4更改您的数据库驱动程序类和URL,如下所示:

 spring.database.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy #append log4jdbc after jdbc part of the URL: hsql example spring.datasource.url=jdbc:log4jdbc:hsqldb:mem:db_name 

除了记录SQL之外,它还将以表格格式记录所有执行查询的结果。 可以根据示例日志记录配置中的注释禁用此function。

样本输出:

 10:44:29.400 [main] DEBUG jdbc.sqlonly - 5. select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_, role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=104 10:44:29.402 [main] INFO jdbc.resultsettable - |----------|---|---|----------|--------|---|-----| |member_id |id |id |member_id |role_id |id |name | |----------|---|---|----------|--------|---|-----| |----------|---|---|----------|--------|---|-----|