21 votes

iBatis, spring, comment enregistrer le sql exécuté ?

J'utilise iBatis avec Spring Framework. Je veux enregistrer le sql qu'iBatis exécute lorsque je dis quelque chose comme

Employee e = (Employee) getSqlMapClientTemplate().queryForObject("emp_sql", emp);

La ligne ci-dessus va chercher l'identifiant "emp_sql" dans le fichier sql ibatis que j'ai. Et ensuite exécuter la requête correspondant à "emp_sql". Je veux enregistrer cette requête.

J'ai le fichier de propriétés log4j xml suivant.

<appender name="sqlLogAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="/disk1/logs/sql.log"/>
    <param name="datePattern" value="'-'yyyy-MM-dd'.txt'"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m %n"/>
    </layout>
   <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG"/>
    </filter>
</appender>

<logger name="log4j.logger.com.ibatis">
    <level value="DEBUG"/>
    <appender-ref ref="sqlLogAppender"/>
</logger>

<logger name="log4j.logger.java.sql.Connection">
    <level value="DEBUG"/>
    <appender-ref ref="sqlLogAppender"/>
</logger>

<logger name="log4j.logger.java.sql.PreparedStatement">
    <level value="DEBUG"/>
    <appender-ref ref="sqlLogAppender"/>
</logger>

Je n'arrive toujours pas à obtenir le sql que l'ibatis a exécuté. Y a-t-il quelque chose qui ne va pas dans la configuration ? Dois-je simplement dire

<appender name="sqlLogAppender" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="/disk1/logs/sql.log"/>
    <param name="datePattern" value="'-'yyyy-MM-dd'.txt'"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m %n"/>
    </layout>
   <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG"/>
    </filter>
</appender>

<logger name="log4j.logger.java.sql">
    <level value="DEBUG"/>
    <appender-ref ref="sqlLogAppender"/>
</logger>

Dois-je utiliser p6spy ou autre chose ? Ou est-ce qu'il y a quelque chose que je peux faire dans la configuration de log4j pour obtenir les logs sql d'iBatis ?

22voto

DwB Points 14687

Ajoutez ce qui suit à votre configuration log4j (décommentez ce que vous voulez voir).

\# SqlMap logging configuration.
#log4j.logger.com.ibatis=DEBUG
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
#log4j.logger.java.sql=DEBUG
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.logger.java.sql.ResultSet=DEBUG

3voto

Ajoutez ceci dans votre log4j.xml

<logger name="com.ibatis" additivity="false">
    <level value="debug"/>
    <appender-ref ref="APPENDER"/>
</logger>

3voto

Lucky Points 748

Si vous utilisez Log4j comme cadre de journalisation, vous devez configurer mybatis pour qu'il utilise log4j comme outil de journalisation par défaut. Vous pouvez le faire en le définissant dans le fichier mybatis-config.xml comme ceci,

<setting name="logImpl" value="LOG4J"/>

Ou si vous n'utilisez pas mybatis-config.xml et que vous vous contentez d'annotations, alors vous voulez utiliser

org.apache.ibatis.logging.LogFactory.useLog4JLogging();

avant d'invoquer toute autre méthode mybatis pour définir l'implémentation par défaut de la journalisation. Lire la suite...

Utilisez cette configuration dans votre log4j.properties ,

# Global logging configuration
log4j.rootLogger=INFO, stdout

# MyBatis mapper interfaces logging configuration...
log4j.logger.com.sample.mappers=DEBUG

# SqlMap logging configuration.
log4j.logger.org.mybatis.spring=DEBUG
log4j.logger.org.apache.ibatis=DEBUG

# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%p] %c - %m%n

Si vous utilisez log4j.xml essayez l'équivalent de ce qui précède,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

  <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%p] %c{1} - %m%n"/>
    </layout>
  </appender>

  <logger name="org.mybatis.spring" additivity="false">
    <level value="debug"/>
    <appender-ref ref="STDOUT"/>
  </logger>

  <logger name="com.sample.mappers">
    <level value="debug"/>
    <appender-ref ref="STDOUT"/>
  </logger>

  <!-- Other custom 3rd party logger configs -->

  <root>
    <priority value ="debug" />
    <appender-ref ref="STDOUT" />
  </root>

</log4j:configuration>

Utilisez le fichier properties ou le fichier xml pour configurer log4j comme indiqué ci-dessus et placez-le dans votre classpath pour que cela fonctionne correctement.

1voto

vsingh Points 1099

Ajoutez ceci dans votre log4j

<logger name="java.sql" additivity="false">
    <level value="debug" />
    <appender-ref ref="console" /> </logger>

Cela permet d'imprimer le code SQL ainsi que les résultats de la sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X