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

89

Je n'ai pas été en mesure de trouver de documentation sur la façon de configurer 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, nous vous en serions reconnaissants.

EDIT:
Juste pour clarifier, je cherche un exemple de la 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 recherche un moyen de quitter et de contrôler la journalisation de mise en veille prolongée de manière distincte de la journalisation au niveau de mon application, 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.

James McMahon
la source
nemo, avez-vous jamais découvert comment faire cela à la manière xml? Vous pourriez peut-être poster une réponse à votre question si vous le faisiez.
Homaxto
homaxto, je l'ai fait. Je publierai cela pour vous une fois que j'en aurai l'occasion.
James McMahon
<appender-ref ref = "console" /> fait que le journal de mise en veille prolongée aille aussi dans le catalina.out, vous devriez commenter cette balise si vous ne voulez pas voir le catalina.out plein de journaux de mise en veille prolongée
Enrique San Martín

Réponses:

161

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 être collé 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 loggers 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 d'Hibernate 3, vous devez définir le niveau sur TRACE (ou ALL) afin de voir 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.

Loki
la source
Je ne suis pas sûr de ce que fait <appender-ref> là-bas, lorsque je le change en un appender dans ma configuration, hibernate semble toujours se connecter à la fois à la console et à mon appender de fichier. Étrange.
James McMahon
C'est étrange, dans Hibernate 3.2.6 pour org.hibernate.type, vous pouvez utiliser le niveau DEBUG et il enregistre tous les paramètres. Dans hibernate 3.5.6 DEBUG ne suffit pas, vous devez mettre TRACE, ce qui est à mon humble avis (une fois que vous le savez) car il enregistre vraiment beaucoup!
Riccardo Cossu
Le nom de la classe a été remanié sur Hibernate 4.2, vous devez donc utiliser pour la journalisation des transactions org.hibernate.engine.transaction. Voir: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan
Vous pouvez également ajouter les enregistreurs au fichier standalone.xml comme suit: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24
1
Le Lin, par exemple, <Logger name="org.hibernate.SQL" level="debug" />devrait-il réellement être capitalisé? Je reçois une erreur dans Tomcat au démarrage en capitalisant L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Je ne sais pas non plus comment cela devrait être entré dans mon fichier log4j.xml. Dois-je avoir un <logger>bloc séparé pour chaque catégorie, avec les <level>balises, ou puis-je m'en tirer avec les one-liners que vous avez présentés?
MegaMatt
25

La réponse de Loki renvoie à la documentation Hibernate 3 et fournit de bonnes informations, mais je n'obtenais toujours pas les résultats escomptés.

Beaucoup de battements, de mouvements de bras et de courses de souris mortes m'ont finalement valu mon fromage.

Étant donné qu'Hibernate 3 utilise Simple Logging Facade pour Java (SLF4J) (selon la documentation), si vous comptez sur Log4j 1.2, vous aurez également besoin du slf4j-log4j12-1.5.10.jar si vous souhaitez configurer entièrement la journalisation Hibernate avec un fichier de configuration log4j. J'espère que cela aidera le prochain.

Dennis S
la source
Vous avez besoin du slf4j-log4j12-1.5.10.jar pour câbler la façade dans la couche de journalisation sous-jacente. Le fichier de configuration est toujours une configuration log4j si vous utilisez log4j comme couche de journalisation.
James McMahon
7

En réponse au commentaire d'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.

James McMahon
la source
5

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;) - réglez le niveau sur "debug" pour obtenir la sortie.

TMN
la source
3

Les réponses étaient utiles. Après le changement, j'ai obtenu une journalisation en double des instructions SQL, une dans le fichier journal log4j et une sur la console standard. J'ai changé le fichier persistence.xml pour dire show_sql à false pour me débarrasser de la journalisation de la console standard. Garder format_sql true affecte également le fichier journal log4j, donc j'ai gardé cela vrai.

<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>
dc360
la source
0

Vous pouvez configurer votre log4jfichier avec la balise category comme ceci (avec un appender de console pour l'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 avertissement, erreur ou message fatal de la mise en veille prolongée sera affiché, rien de plus. En outre, votre code et le code de la bibliothèque seront au niveau info (donc info, avertissement, erreur et fatal)

Pour changer le niveau de journal d'une bibliothèque, ajoutez simplement une catégorie, par exemple, au journal des informations sur les ressorts désactivés:

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

Ou avec un autre appendeur, cassez l'additivité (la valeur par défaut d'additivité est vraie)

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

Et si vous ne voulez pas de ce journal d'hibernation à chaque requête, définissez la propriété hibernate show_sqlsur false.

Emilien Brigand
la source