Stai configurando la registrazione di Hibernate utilizzando il file di configurazione XML Log4j?


89

Non sono stato in grado di trovare alcuna documentazione su come configurare la registrazione di Hibernate utilizzando il file di configurazione in stile XML per Log4j.

È anche possibile o devo usare un file di configurazione dello stile delle proprietà per controllare la registrazione di Hibernate?

Se qualcuno ha informazioni o collegamenti alla documentazione, sarebbe apprezzato.

EDIT:
Solo per chiarire, sto cercando un esempio dell'attuale sintassi XML per controllare Hibernate.

EDIT2:
Ecco cosa ho nel mio file di configurazione 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 registrazione funziona correttamente ma sto cercando un modo per scendere e controllare la registrazione di ibernazione in modo separato dalla registrazione a livello di applicazione, poiché attualmente sta inondando i miei registri. Ho trovato esempi di utilizzo del file delle preferenze per fare ciò, mi chiedevo solo come posso farlo in un file XML.


nemo, hai mai scoperto come farlo in xml? Forse potresti pubblicare una risposta alla tua domanda se lo facessi.
homaxto

homaxto, l'ho fatto. Lo pubblicherò per te una volta che ne avrò la possibilità.
James McMahon

<appender-ref ref = "console" /> fa in modo che il registro di ibernazione vada anche a catalina.out, dovresti commentare questo tag se non vuoi vedere catalina.out pieno di registri di ibernazione
Enrique San Martín

Risposte:


161

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

Ecco l'elenco delle categorie di logger:

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) 

Formattato per essere incollato in un file di configurazione 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 maggior parte dei logger utilizza il livello DEBUG, tuttavia org.hibernate.type utilizza TRACE. Nelle versioni precedenti di Hibernate org.hibernate.type utilizzava anche DEBUG, ma a partire da Hibernate 3 è necessario impostare il livello su TRACE (o ALL) per vedere la registrazione dell'associazione dei parametri JDBC.

E una categoria è specificata come tale:

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

Deve essere posizionato prima dell'elemento radice.


Non sono sicuro di cosa ci faccia <appender-ref>, quando lo cambio in un appender nella mia configurazione, l'ibernazione sembra ancora accedere sia alla console che al mio file appender. Strano.
James McMahon

Questo è strano, in Hibernate 3.2.6 per org.hibernate.type puoi usare il livello DEBUG e registra tutti i parametri. In ibernazione 3.5.6 DEBUG non è sufficiente, devi mettere TRACE, che è IMHO ok (una volta che lo conosci) dato che registra davvero molto!
Riccardo Cossu

Il nome della classe è stato refactoring su Hibernate 4.2 quindi per la registrazione delle transazioni è necessario utilizzare org.hibernate.engine.transaction. Vedi: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan

Puoi anche aggiungere i logger a standalone.xml come segue: <logger categoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24

1
La Lin, ad esempio, <Logger name="org.hibernate.SQL" level="debug" />dovrebbe essere effettivamente capitalizzata? Ottengo un errore in Tomcat all'avvio quando capitalizzando la L: "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Sono anche confuso su come questo dovrebbe effettivamente essere inserito nel mio file log4j.xml. Dovrei avere un <logger>blocco separato per ogni categoria, completo di <level>tag, o posso farla franca con le battute che hai presentato?
MegaMatt

25

La risposta di Loki punta ai documenti di Hibernate 3 e fornisce buone informazioni, ma non stavo ancora ottenendo i risultati che mi aspettavo.

Molti colpi, agitare le braccia e corse di topi morti in generale mi hanno finalmente fatto atterrare il mio formaggio.

Poiché Hibernate 3 utilizza Simple Logging Facade for Java (SLF4J) (secondo la documentazione), se ti affidi a Log4j 1.2 avrai anche bisogno di slf4j-log4j12-1.5.10.jar se desideri configurare completamente la registrazione di Hibernate con un file di configurazione log4j. Spero che questo aiuti il ​​prossimo ragazzo.


Sì, è necessario slf4j-log4j12-1.5.10.jar per collegare la facciata al livello di registrazione sottostante. Il file di configurazione è ancora una configurazione log4j se si utilizza log4j come livello di registrazione.
James McMahon

7

In risposta al commento di homaxto, questo è quello che ho in questo momento.

<?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 parte fondamentale è

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

Spero che questo ti aiuti.


5

Ecco cosa utilizzo:

<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> 

Ovviamente, non mi piace vedere i messaggi di Hibernate;) - imposta il livello su "debug" per ottenere l'output.


3

Le risposte sono state utili. Dopo la modifica, ho ottenuto la registrazione duplicata delle istruzioni SQL, una nel file di registro log4j e una nella console standard. Ho modificato il file persistence.xml in show_sql in false per eliminare la registrazione dalla console standard. Mantenere format_sql true influisce anche sul file di log log4j, quindi l'ho mantenuto vero.

<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>

0

Puoi configurare il tuo log4jfile con il tag di categoria in questo modo (con un appender per console per l'esempio):

<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>

Quindi ogni avviso, errore o messaggio fatale da ibernazione verrà visualizzato, niente di più. Inoltre, il codice e il codice della libreria saranno a livello di informazioni (quindi informazioni, avviso, errore e fatale)

Per modificare il livello di registro di una libreria, è sufficiente aggiungere una categoria, ad esempio, al registro delle informazioni sulla primavera disattivato:

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

O con un altro appender, interrompi l'additività (il valore predefinito dell'additività è vero)

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

E se non vuoi che l'ibernazione registri ogni query, imposta la proprietà di ibernazione show_sqlsu false.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.