web-dev-qa-db-fra.com

Configuration de la journalisation Hibernate à l'aide du fichier de configuration XML Log4j?

Je n'ai trouvé aucune documentation sur la configuration de la journalisation d'Hibernate à l'aide du fichier de configuration de style XML pour Log4j.

Est-ce même possible ou dois-je utiliser un fichier de configuration de style de propriétés pour contrôler la journalisation d'Hibernate?

Si quelqu'un a des informations ou des liens vers de la documentation, cela serait apprécié.

MODIFIER:
Juste pour clarifier, je cherche un exemple de syntaxe XML réelle pour contrôler Hibernate.

EDIT2:
Voici ce que j'ai dans mon fichier de configuration XML.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
    <appender name="console" class="org.Apache.log4j.ConsoleAppender">
        <param name="Threshold" value="info"/>
        <param name="Target" value="System.out"/>
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.Apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="1000KB"/>
    <!-- Keep one backup file -->
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

La journalisation fonctionne bien, mais je cherche un moyen d'abandonner et de contrôler la journalisation d'hibernation de manière distincte de la journalisation au niveau de mes applications, car elle inonde actuellement mes journaux. J'ai trouvé des exemples d'utilisation du fichier de préférences pour ce faire. Je me demandais simplement comment je pouvais le faire dans un fichier XML.

83
James McMahon

De http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging

Voici la liste des catégories d'enregistreurs:

Category                    Function

org.hibernate.SQL           Log all SQL DML statements as they are executed
org.hibernate.type          Log all JDBC parameters
org.hibernate.tool.hbm2ddl  Log all SQL DDL statements as they are executed
org.hibernate.pretty        Log the state of all entities (max 20 entities) associated with the session at flush time
org.hibernate.cache         Log all second-level cache activity
org.hibernate.transaction   Log transaction related activity
org.hibernate.jdbc          Log all JDBC resource acquisition
org.hibernate.hql.ast.AST   Log HQL and SQL ASTs during query parsing
org.hibernate.secure        Log all JAAS authorization requests
org.hibernate               Log everything (a lot of information, but very useful for troubleshooting) 

Formaté pour le collage dans un fichier de configuration XML log4j:

<!-- Log all SQL DML statements as they are executed -->
<Logger name="org.hibernate.SQL" level="debug" />
<!-- Log all JDBC parameters -->
<Logger name="org.hibernate.type" level="debug" />
<!-- Log all SQL DDL statements as they are executed -->
<Logger name="org.hibernate.tool.hbm2ddl" level="debug" />
<!-- Log the state of all entities (max 20 entities) associated with the session at flush time -->
<Logger name="org.hibernate.pretty" level="debug" />
<!-- Log all second-level cache activity -->
<Logger name="org.hibernate.cache" level="debug" />
<!-- Log transaction related activity -->
<Logger name="org.hibernate.transaction" level="debug" />
<!-- Log all JDBC resource acquisition -->
<Logger name="org.hibernate.jdbc" level="debug" />
<!-- Log HQL and SQL ASTs during query parsing -->
<Logger name="org.hibernate.hql.ast.AST" level="debug" />
<!-- Log all JAAS authorization requests -->
<Logger name="org.hibernate.secure" level="debug" />
<!-- Log everything (a lot of information, but very useful for troubleshooting) -->
<Logger name="org.hibernate" level="debug" />

NB: La plupart des enregistreurs utilisent le niveau DEBUG. Cependant, org.hibernate.type utilise TRACE. Dans les versions précédentes de Hibernate, org.hibernate.type utilisait également DEBUG, mais à partir de Hibernate 3, vous devez définir le niveau sur TRACE (ou ALL) pour afficher la journalisation de la liaison des paramètres JDBC.

Et une catégorie est spécifiée comme telle:

<logger name="org.hibernate">
    <level value="ALL" />
    <appender-ref ref="FILE"/>
</logger>

Il doit être placé avant l'élément racine.

151
Loki

Loki 's answer pointe vers la documentation d'Hibernate 3 et fournit de bonnes informations, mais je n'obtenais toujours pas les résultats escomptés.

De nombreuses bagarres, agitations de bras et courses de souris mortes en général m'ont finalement débarqué mon fromage.

Parce qu'Hibernate 3 utilise Façade de journalisation simple pour Java (SLF4J) (conformément à la documentation), si vous vous appuyez sur Log4j 1.2 vous aussi aurez besoin de slf4j-log4j12-1.5.10.jar si vous voulez entièrement configurer la journalisation Hibernate avec un fichier de configuration log4j. J'espère que cela aide le prochain gars.

25
Dennis S

En réponse au commentaire de homaxto, voici ce que j'ai en ce moment.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
    <appender name="console" class="org.Apache.log4j.ConsoleAppender">
        <param name="Threshold" value="debug"/>
        <param name="Target" value="System.out"/>
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.Apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="500KB"/>
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <logger name="org.hibernate">
        <level value="info" />
    </logger>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

La partie clé étant 

<logger name="org.hibernate">
    <level value="info" />
</logger>

J'espère que cela t'aides.

7
James McMahon

Voici ce que j'utilise:

<logger name="org.hibernate">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.SQL">
    <level value="warn"/>
</logger>

<logger name="org.hibernate.type">
    <level value="warn"/>
</logger>

<root>
    <priority value="info"/>
    <appender-ref ref="C1"/>
</root> 

Évidemment, je n'aime pas voir les messages Hibernate;) - définissez le niveau sur "debug" pour obtenir le résultat.

5
TMN

Les réponses étaient utiles. Après le changement, la journalisation des instructions SQL en double, une dans le fichier journal log4j et une dans la console standard. J'ai modifié le fichier persistence.xml pour qu'il indique false à show_sql afin de supprimer la journalisation depuis la console standard. Conserver format_sql affecte également le fichier journal log4j, je l’ai donc conservé.

<persistence xmlns="http://Java.Sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://Java.Sun.com/xml/ns/persistence http://Java.Sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:d:\temp\database\cap1000;shutdown=true"></property>
            <property name="dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>
3
dc360

Vous pouvez configurer votre fichier log4j avec la balise category comme ceci (avec un appender console par exemple):

<appender name="console" class="org.Apache.log4j.ConsoleAppender">
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yy-MM-dd HH:mm:ss} %p %c - %m%n" />
    </layout>
</appender>
<category name="org.hibernate">
    <priority value="WARN" />
</category>
<root>
    <priority value="INFO" />
    <appender-ref ref="console" />
</root>

Ainsi, chaque message d’avertissement, d’erreur ou fatal de Hibernate sera affiché, rien de plus. De plus, votre code et le code de la bibliothèque seront au niveau info (donc info, warn, error et fatal)

Pour changer le niveau de journalisation d'une bibliothèque, ajoutez simplement une catégorie, par exemple, au journal des informations de ressort désactif:

<category name="org.springframework">
    <priority value="WARN" />
</category>

Ou avec un autre appender, casser l'additivité (la valeur par défaut d'additivité est true)

<category name="org.springframework" additivity="false">
    <priority value="WARN" />
    <appender-ref ref="anotherAppender" />
</category>

Et si vous ne souhaitez pas que le journal d'hibernation soit consigné à chaque requête, définissez la propriété hibernate show_sql sur false.

0
Emilien Brigand