web-dev-qa-db-fra.com

Spring-boot avec spring-mybatis - comment le forcer à enregistrer toutes les requêtes SQL

J'ai une application simple Spring-Boot-Mybatis (n'oubliez pas, s'il vous plaît). Mybatis enregistre les requêtes SQL uniquement en cas d'échec (sauf exception). Dites-moi s'il vous plaît, comment le forcer à enregistrer toutes les requêtes SQL sur la console? 

En ce moment, j'utilise slf4j logger (configuré automatiquement par spring-boot).
Je trouve ce lien: http://www.mybatis.org/mybatis-3/logging.html
Cependant, je n'ai pas réussi à le suivre. Tout d'abord, la configuration est affichée pour log4j, et je ne suis pas sûr. Si je comprends bien: est-il suffisant de configurer dans application.properties

Merci d'avance 

6
user6023611

Le démarrage printanier utilise logback comme fournisseur de journalisation par défaut pour Slf4j. La fabrique de journaux interne Ibatis charge le SLF4j comme enregistreur de premier choix. Tout ce que vous avez à faire est de configurer votre enregistreur de démarrage printanier pour publier les messages de journal pour ibatis mapper.

Ajoutez les lignes ci-dessous dans les propriétés de l'application de démarrage.

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

La deuxième ligne est l'endroit où vous définissez l'entrée de journalisation pour ibatis mapper avec le niveau de journalisation DEBUG. com.spring.ibatis est un package et la UserMapper est un exemple de mappeur.

Les journaux suivants commenceront à apparaître dans la console et dans le fichier spring-boot-logging. Ce sont les messages de journal générés par les méthodes saveUser et findByName de la classe 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

Vous pouvez bien sûr configurer le choix de l’enregistreur de votre choix. Je peux facilement ajouter un exemple pour tout autre enregistreur si vous en avez besoin.

Vous trouverez le code complet avec les scénarios de test Junit à l'adresse https://github.com/saagar2000/ibatis

13
Veeram

Une approche alternative consiste à utiliser un pilote proxy tel que log4jdbc2, qui présente l'avantage de consigner le code SQL exact allant à la base de données avec des paramètres en place, contrairement aux autres réponses. Cela fonctionnera quelle que soit la couche d'abastraction de persistance (par exemple, iBatis, JPA, etc.).

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

L’un des principaux avantages de cette méthode est que vous pouvez copier le code SQL directement dans votre base de données DB et l’exécuter tel quel.

1 Ajouter des dépendances Maven:

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

2 Ajouter une configuration de journal. Copiez les parties pertinentes dans votre fichier existant 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 Informez log4jdbc2 de votre configuration de journalisation:

Créez un fichier nommé log4jdbc.log4j2.properties à la racine du chemin de classe src/test/resources ou src/main/resources dans un projet Maven. Ce fichier a une ligne qui est la suivante:

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

4 Modifiez votre classe de pilote de base de données et votre URL comme suit:

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 

En plus de consigner le code SQL, il enregistrera également, sous forme de tableau, les résultats de toutes les requêtes exécutées. Cela peut être désactivé selon le commentaire dans l'exemple de configuration de la journalisation.

Exemple de sortie:

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 |
|----------|---|---|----------|--------|---|-----|
|----------|---|---|----------|--------|---|-----|
1
Alan Hay

SLF4J ne remplace pas log4j, ils travaillent ensemble. Il supprime la dépendance sur log4j de votre bibliothèque/application.

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

Il est donc bien d’utiliser les configurations log4j si vous utilisez slf4j, tant que vous utilisez log4j sous slf4j.

Voici un guide sur l'utilisation de slf4j avec log4j logger: http://saltnlight5.blogspot.ca/2013/08/how-to-configure-slf4j-with-different.html

Il vous suffit essentiellement de créer un fichier de propriétés ici: src/main/resources/log4j.properties et de le configurer de la même manière que celui de votre lien. Et comme votre lien l'indique:

... Pour cela, les instructions SQL sont consignées au niveau DEBUG (FINE dans la journalisation JDK) et les résultats au niveau TRACE (FINER dans la journalisation JDK) ...

Assurez-vous donc que log4j.logger.org.mybatis.example=DEBUG est défini dans votre fichier de propriétés.

0
Alic