私は簡単なspring-boot-mybatisアプリを持っています(覚えておいてください)。 Mybatisは、(例外で)失敗した場合にのみSQLクエリをログに記録します。コンソールにすべてのSQLクエリを記録するように強制する方法を教えてください。
現在、slf4j
ロガーを使用しています(spring-boot
によって自動的に構成されます)。
私はこのリンクを見つけます: http://www.mybatis.org/mybatis-3/logging.html
しかし、私はそれをなんとかフォローできませんでした。まず最初にlog4j
の構成を示していますが、よくわかりません。application.properties
で構成するだけで十分ですか?
前もって感謝します
Springブートは、Slf4jのデフォルトのロギングプロバイダーとしてlogbackを使用します。 Ibatisの内部ログファクトリは、SLF4jを最初の選択肢のロガーとしてロードします。あなたがしなければならないのは、ibatisマッパーのログメッセージを発行するように春のブートロガーを構成することだけです。
ブートアプリケーションのプロパティに以下の行を追加します。
logging.level.org.springframework=WARN
logging.level.com.spring.ibatis.UserMapper=DEBUG
logging.file=logs/spring-boot-logging.log
2行目は、DEBUGログレベルでibatisマッパーのログエントリを定義する場所です。 com.spring.ibatis
はパッケージで、UserMapper
はサンプルマッパーです。
次のログがコンソールとspring-boot-loggingファイルに表示され始めます。これらは、saveUser
クラスのfindByName
およびApplicationTest
メソッドから生成されたログメッセージです。
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テストケースの完全なコードを見つけることができます。
別のアプローチは、他の回答とは異なり、適切なパラメータを使用してデータベースに送信される正確なSQLをログに記録できるという利点があるlog4jdbc2などのプロキシドライバを使用することです。これは永続化の抽象化レイヤー(iBatis、JPAなど)に関係なく機能します。
https://code.google.com/archive/p/log4jdbc-log4j2/
これの大きな利点の1つは、SQLをDBフロントエンドに直接コピーして、そのまま実行できることです。
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にログ設定を通知します:
クラスパスのルートにlog4jdbc.log4j2.propertiesというファイルを作成しますsrc/test/resourcesまたはsrc/main/resources:Mavenプロジェクト。このファイルには、以下の1行があります。
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
4 DBドライバークラスと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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|