Spring-boot with spring-mybatis - 如何强制它记录所有 SQL 查询

Spring-boot with spring-mybatis - how to force it to logging all SQL queries

我有一个简单的spring-boot-mybatis 应用程序(请记住)。 Mybatis 仅在失败(异常)的情况下记录 SQL 查询。请告诉我,如何强制它记录所有 SQL 查询到控制台?

此时我正在使用 slf4j 记录器(由 spring-boot 自动配置)。
我发现这个 link:http://www.mybatis.org/mybatis-3/logging.html
但是我没有设法遵循它。首先显示 log4j 的配置,我不确定我是否正确理解:在 application.properties 中配置是否足够?

提前致谢

SLF4J does not replace log4j, they work together. It removes the dependency on log4j from your library/app.

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

所以如果你用的是slf4j,那么用log4j的配置是没问题的,只要你在slf4j下使用log4j即可。

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

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

... For that purpose SQL statements are logged at the DEBUG level (FINE in JDK logging) and results at the TRACE level (FINER in JDK logging) ...

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

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

在启动应用程序属性中添加以下行。

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

第二行是为ibatis mapper定义日志级别为DEBUG的地方。 com.spring.ibatis 是包,UserMapper 是样本映射器。

以下日志将开始出现在控制台和 spring-boot-logging 文件中。这些是 saveUserfindByName 方法 ApplicationTest class.

生成的日志消息
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

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

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

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

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

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

1 添加 Maven 依赖项:

<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>

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

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
        </pattern>
    </encoder>
</appender>

<logger name="jdbc.audit" level="ERROR" />
<logger name="jdbc.connection" level="ERROR" />
<logger name="jdbc.sqltiming" level="ERROR" />
<logger name="jdbc.resultset" level="ERROR" />

<!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
<!--<logger name="jdbc.resultsettable" level="ERROR" /> -->

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

3 告诉 log4jdbc2 您的日志配置:

在 class 路径 src/test/resources[=52 的根目录创建一个名为 log4jdbc.log4j2.properties 的文件=] 或 src/main/resources 在 Maven 项目中。该文件有一行如下:

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

4 更改您的数据库驱动程序 class 和 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 之外,它还会以表格格式记录所有查询执行的结果。这可以根据示例日志记录配置中的注释禁用。

示例输出:

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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|

尝试在 application.properties 文件中使用下面的配置。

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

可以在 manual and details

中找到更多信息

接受的答案对我来说不太适用(我猜 6 年内情况会发生变化!!)。我使用的是 YAML 而不是属性文件,并且通过 logback-spring.xml 配置了 logback。我有我认为等同于接受的答案但没有将 mybatis 日志记录发送到控制台日志。主要问题是我使用的是 DEBUG 级别,它似乎需要 TRACE(Mybatis Documentation 向我指出了那个方向)。

万一有人使用 logback-spring.xml 配置他们的日志记录,您应该看起来像这样:

<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <springProfile name="local">
        <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
        <logger name="org.springframework" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
        </logger>
        <logger name="com.mycompany" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE"/>
        </logger>
        <!-- Important to have TRACE as the level, and the package where the mybatis logic is specified in the logger name-->
        <logger name="com.mycompany.myapp.dataaccess" level="TRACE" additivity="false">
            <appender-ref ref="CONSOLE"/>
        </logger>
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
</configuration>