簡體   English   中英

Spring-boot 與 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自動配置)。
我找到這個鏈接: http ://www.mybatis.org/mybatis-3/logging.html
但是我沒有設法遵循它。 首先顯示log4j的配置,我不確定是否正確理解:在application.properties中配置是否足夠?

提前致謝

Spring boot 使用 logback 作為 Slf4j 的默認日志提供程序。 Ibatis 內部日志工廠加載 SLF4j 作為首選 logger。 您所要做的就是配置您的 Spring Boot 記錄器以發布 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 文件中。 這些是從ApplicationTest類的saveUserfindByName方法生成的日志消息。

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,它們一起工作。 它從您的庫/應用程序中刪除了對 log4j 的依賴。

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並將其配置為與鏈接中的相同。 正如你的鏈接所說:

...為此,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 依賴項:

<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 您的日志配置:

在 Maven 項目中的類路徑src/test/resourcessrc/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 之外,它還會以表格格式記錄所有執行查詢的結果。 這可以根據示例日志配置中的注釋禁用。

樣本輸出:

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

更多信息可以在手冊細節中找到

接受的答案對我來說不太管用(我猜事情會在 6 年內發生變化!!)。 我使用的是 YAML 而不是屬性文件,並且通過 logback-spring.xml 配置了 logback。 我有我認為等同於接受的答案,但沒有將 mybatis 日志發送到控制台日志。 主要問題是我使用的是 DEBUG 級別,它似乎需要 TRACE( Mybatis 文檔為我指明了那個方向)。

如果有人使用 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM