[英]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
類的saveUser
和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,它們一起工作。 它從您的庫/應用程序中刪除了對 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/resources或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 之外,它還會以表格格式記錄所有執行查詢的結果。 這可以根據示例日志配置中的注釋禁用。
樣本輸出:
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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|
接受的答案對我來說不太管用(我猜事情會在 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.