2009-09-04 3 views
8

Non sono stato in grado di ottenere ulteriori output di console (per facilitare il debug) da Hibernate nonostante l'impostazione di alcune proprietà nel file hibernate.cfg.xml. Ad esempio, l'aggiunta della riga <property name="show_sql">true</property> non ha, infatti, mostrato istruzioni SQL nella console.Come ottengo più messaggi di debug da Hibernate?

Ho anche provato a giocare con il contenuto del file log4j.properties - come l'impostazione log4j.logger.org.hibernate=debug - senza fortuna. Cosa mi manca?


Edit: il contenuto del file di sospensione-service.xml sono

<server> 
    <mbean code="org.jboss.hibernate.jmx.Hibernate" 
     name="jboss.har:service=Hibernate_SMS"> 
     <attribute name="DatasourceName">java:/SMS_DS</attribute> 
     <attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute> 
     <attribute name="SessionFactoryName">java:/hibernate/SessionFactory</attribute> 
     <attribute name="CacheProviderClass">org.hibernate.cache.HashtableCacheProvider</attribute> 
     <attribute name="ShowSqlEnabled">true</attribute> 
    </mbean> 
</server> 

Io non sono al 100% sicuro se questo ha in realtà alcun effetto, però. Quel file XML è nel progetto Eclipse che gestisce il mio materiale di database, ma non sembra essere nella directory di distribuzione di JBoss.


Edit 2: Questo è sicuramente distribuito come HAR. Detto questo, sono abbastanza sicuro di aver bisogno di hibernate.cfg.xml - Ricordo di avere problemi quando un documento di mappatura è stato omesso come una voce in quel file. Credo che la HAR è generato usando Ant - c'è un obiettivo per esso nel file build.xml:

<target name="har" depends="prepare" description="Builds the Hibernate HAR file"> 
    <mkdir dir="${class.root}" /> 
    <mkdir dir="${distribution.dir}" /> 

    <jar destfile="${distribution.dir}/${har.name}">      
     <!-- include the hbm.xml files --> 
     <fileset dir="${class.root}"> 
      <include name="**/*.hbm.xml"/> 
      <include name="com/[redacted]/sms/data/dto/*.class"/> 
      <include name="com/[redacted]/sms/data/dto/base/*.class"/> 
     </fileset> 

     <!-- include jboss-service.xml --> 
     <metainf dir="${hibernate.dir}"> 
      <include name="hibernate-service.xml"/> 
     </metainf> 
    </jar> 
</target> 

ma quando lo faccio la build formica con XML in modo non corretto, formato nel file di sospensione-service.xml, si non fallisce Aggiornamento Anche l'eliminazione completa del file non causa il fallimento di una build. Qualche idea qui? End Modifica

Suona come ottenere Hibernate alle dichiarazioni uscita SQL dovrebbe (se tutto è impostato correttamente) prendersi cura di esso del tutto - vuol dire che le impostazioni in log4j.properties non farà la differenza qui? - perché in realtà fa cambia l'output quando si esegue ant.

Edit 3: Dopo incorrere in altri problemi strani con i miei dati har, ho cancellato il file har interamente e ricostruito utilizzando il target Ant har. All'improvviso tutto funziona! Grazie a Chessplay per la sua straordinaria disponibilità. Non posso dire di sapere esattamente cosa ha fatto alla fine, ma preferirei riconoscere i suoi sforzi piuttosto che scrivere e accettare la mia risposta; Le mie scuse se non sei un "lui".

+0

'hibernate.show_sql' (o,' ShowSqlEnabled' in JBoss mbean) è indipendente dalla configurazione di registrazione; se abilitato stampa sempre SQL su console. L'impostazione di 'org.hibernate.SQL = DEBUG' nella configurazione del logger appropriato farà lo stesso, ma a qualsiasi output configurato per il logger. Entrambi i metodi sono indipendenti l'uno dall'altro (ad esempio, se si imposta entrambi, verrà stampato sql due volte) – ChssPly76

risposta

10

Il nome proprietà corretto è hibernate.show_sql e funziona sicuramente.

Assicurati che il tuo hibernate.cfg.xml sia quello giusto e che venga prelevato; lo stesso vale per il tuo file log4j.properties. So che quelli sembrano suggerimenti stupidi, ma rappresentano il 98% dei problemi di "mancanza di registrazione".

Aggiornamento: aggiornerò la risposta anziché aggiungere commenti. È necessario assicurarsi che il tuo hibernate-service.xml venga prelevato da JBoss. Il modo semplice per verificare è aggiungere un errore di sintassi (come omettere una parentesi di chiusura su qualche elemento) e vedere se JBoss esplode durante il riavvio :-) Dovrebbe essere impacchettato in har e distribuito come parte del processo di compilazione, quindi se ti accorgi che è non raccolto da JBoss, questo è il posto giusto da guardare.Mi libererei delle impostazioni in conflitto in hibernate.cfg.xml (ad esempio, tutto ciò che specifichi come attributi mbean non dovrebbe essere replicato in hibernate.cfg.xml). Del resto, hai anche bisogno di hibernate.cfg.xml? Se installato come HAR, i mapping dovrebbero essere automaticamente scansionati/prelevati.

+0

Devo anche impostare il livello di registro in log4j.properties? - All'inizio ho trovato che stavo lavorando con le copie sbagliate di quei due file, ma passai agli strumenti con le copie corrette prima di chiederle qui. –

+0

L'impostazione di hibernate.show_sql su true dovrebbe stampare SQL su console _irregardless_ della configurazione di registrazione. In alternativa, puoi impostare il livello di log 'org.hibernate.SQL' su DEBUG per indirizzarlo al file di log di tua scelta (come configurato nella configurazione di registrazione) – ChssPly76

+0

Ho cambiato la riga in' true 'ma ancora nulla. : \ –

6

Io uso solo il file log4j.properties per registrare le istruzioni di Hibernate. Per le istruzioni SQL, il proprietà log4j.logger.org.hibernate.SQL deve essere impostata per eseguire il debug , e per i parametri SQL/restituito valori log4j.logger.org.hibernate.type proprietà deve essere impostata a traccia.

Ecco il file log4j.properties che uso:

### direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 

### Root logger 
log4j.rootLogger=debug, stdout 

### Main Hibernate 
log4j.logger.org.hibernate=debug 

### log just the SQL 
log4j.logger.org.hibernate.SQL=debug 

### log JDBC bind parameters 
log4j.logger.org.hibernate.type=trace 
+0

Per qualsiasi motivo, il mio file 'log4j.properties' non sembra influenzare l'output della console quando JBoss è in esecuzione. Tuttavia, sembra che controlli il livello di output quando eseguo il mio script di formica. –

1

fanno anche shure si sta utilizzando il corretto log4j-configurazione.

Quando si esegue in jboss (si sta facendo ciò, vero?), Si configura log4j-logging in $JBOSS_HOME/server/<config>/conf/jboss-log4j.xml.

Esistono due appendici predefinite; FILE scrive a log/server.log e CONSOLE a stdout (a volte reindirizzata log/console.log). Regolare la soglia sull'appender su DEBUG nel file o impostando la proprietà di sistema jboss.server.log.threshold (dipende dalla versione di jboss che si sta utilizzando).

Avrete anche bisogno di regolare la priorità di registrazione di Hibernate con l'aggiunta di una categoria:

<category name="org.hibernate"> 
    <priority value="DEBUG"/> 
</category>