Disattivazione dell'output della console di registrazione dell'ibernazione


85

Sto usando ibernazione 3 e voglio impedirgli di scaricare tutti i messaggi di avvio sulla console. Ho provato a commentare le righe stdout in log4j.properties ma senza fortuna. Ho incollato il mio file di registro di seguito. Inoltre sto usando eclipse con la struttura del progetto standard e ho una copia di log4j.properties sia nella radice della cartella del progetto che nella cartella bin.

### messaggi di log diretti a 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 {ASSOLUTO}% 5p% c {1}:% L -% m% n

### indirizza i messaggi al file hibernate.log ###
log4j.appender.file = org.apache.log4j.FileAppender
log4j.appender.file.File = hibernate.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern =% d {ASSOLUTO}% 5p% c {1}:% L -% m% n

### imposta i livelli di log - per una registrazione più dettagliata cambia 'info' in 'debug'

log4j.rootLogger = avvisa, stdout

# log4j.logger.org.hibernate = informazioni
log4j.logger.org.hibernate = debug

### log l'attività dell'analizzatore di query HQL
# log4j.logger.org.hibernate.hql.ast.AST = debug

### registra solo l'SQL
# log4j.logger.org.hibernate.SQL = debug

### log JDBC bind parametri ###
log4j.logger.org.hibernate.type = informazioni
# log4j.logger.org.hibernate.type = debug

### esportazione / aggiornamento dello schema di log ###
log4j.logger.org.hibernate.tool.hbm2ddl = debug

### log HQL analizza alberi
# log4j.logger.org.hibernate.hql = debug

### registra l'attività della cache ###
# log4j.logger.org.hibernate.cache = debug

### registra l'attività delle transazioni
# log4j.logger.org.hibernate.transaction = debug

### log acquisizione risorse JDBC
# log4j.logger.org.hibernate.jdbc = debug

### abilita la seguente riga se vuoi rintracciare la connessione ###
### perdite durante l'utilizzo di DriverManagerConnectionProvider ###
# log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider = trac5

2
Vale la pena ricordare che Hibernate 4+ utilizza la registrazione JBOSS.
Occhio

Risposte:


78

Prova a impostare un livello di registrazione più ragionevole. L'impostazione del livello di registrazione su infosignifica che vengono registrati solo gli eventi di registro al infolivello o superiore ( warn, errore fatal), ovvero gli debugeventi di registrazione vengono ignorati.

log4j.logger.org.hibernate=info

o nella versione XML del file di configurazione log4j:

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

Vedi anche il manuale di log4j .


1
Come si fa nella versione XML?
James McMahon,

Puoi applicarlo a tutti i pacchetti in org.hibernate facendo quanto sopra, o se vuoi diversi livelli per diversi pacchetti all'interno di hibernate, puoi specificare quei pacchetti allo stesso modo.
Matthew Brubaker

3
Questo sembra logico, ma ancora non funziona per me (Spring 3.0.5, Hibernate 3.5.6, bridge sf4j-log4j). Ricevo ancora circa 100 righe di commenti "INFO" all'avvio di Hibernate ogni volta. Quindi questo potrebbe non funzionare per tutti.
Joseph Lust

1
@Twisted Pear: imposta il livello di registrazione su WARN. Quindi non riceverai messaggi INFO.
Juha Syrjälä

5
Follow-up poiché questo non è mai stato risolto adeguatamente: Hibernate, anche in 4.3.0.Final, ha molte System.out.println()chiamate hardcoded .
chrylis -cautiouslyoptimistic-

86

Avviso importante: la proprietà (parte della configurazione di ibernazione, NON parte della configurazione del framework di registrazione!)

hibernate.show_sql

controlla il logging direttamente su STDOUT bypassando qualsiasi framework di logging (che puoi riconoscere dalla formattazione mancante dell'output dei messaggi). Se usi un framework di registrazione come log4j, dovresti sempre impostare quella proprietà su false perché non ti dà alcun vantaggio.

Quella circostanza mi ha irritato per un bel po 'di tempo perché non me ne sono mai preoccupato fino a quando non ho provato a scrivere qualche benchmark su Hibernate.


2
Ho dovuto impostare questa proprietà nella mia hibernate.xmlconfigurazione Hibernate (cioè ), al contrario della mia configurazione di registrazione. Grazie per il puntatore!
JJ Zabkar

c'è un modo per avere questa registrazione per non bypassare il mio framework di registrazione ma per usarla effettivamente? Vedo alcune eccezioni inviate allo stdout che vorrei registrare.
Legna

1
Con il mio progetto Spring boot l'ho aggiunto in un file di configurazione YML del profilo. Ma non ha funzionato, proprio come gli altri post su questo thread ... I log di ibernazione continuano a essere scritti indipendentemente da ciò che ho specificato. Può essere gestito da qualche altra parte rispetto alla configurazione di Logback, al file yaml dell'applicazione e al pom.xml?
Alex

34

In esecuzione:

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.OFF);

prima che l'inizializzazione di Hibernate funzionasse per me.


Nota: la riga sopra disattiverà ogni registrazione ( Level.OFF). Se vuoi essere meno severo, puoi usare

java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);

è abbastanza silenzioso. (Oppure controlla la java.util.logging.Levelclasse per più livelli).


2
Questo ha funzionato per me:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
RafiAlhamd

16

È possibile disabilitare molti degli output di hibernate impostando questo props di hibernate (configurazione hb) a false:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Ma se vuoi disabilitare tutte le informazioni della console devi impostare il livello di logger su NESSUNO FATALE di classe org.hibernatecome dice Juha.


E se volessi generare statistiche, ma non registrare?
markthegrea

7

Alla fine ho capito, è perché Hibernate sta usando la facciata del log di slf4j ora, per collegare a log4j, devi mettere i jar log4j e slf4j-log4j12 nella tua libreria e quindi le proprietà log4j prenderanno il controllo dei log di Hibernate.

La mia impostazione pom.xml appare come di seguito:

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.6.4</version>
    </dependency>

In realtà puoi fare in modo che Hibernate usi esplicitamente slf4j aggiungendo -Dorg.jboss.logging.provider=slf4jalle opzioni della tua VM. Ho scritto un articolo sull'argomento: medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge

5

Per disabilitare il Hibernate:selectmessaggio nel log, è possibile impostare la proprietà in HibernateJpaVendorAdapter:

<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="false"/>
</bean> 

4

Per coloro che non vogliono soluzioni eleganti, solo un modo rapido e sporco per fermare quei messaggi, ecco una soluzione che ha funzionato per me (uso Hibernate 4.3.6 ed Eclipse e nessuna risposta fornita sopra (o trovata su Internet) ha funzionato; né i file di configurazione log4j né l'impostazione del livello di registrazione in modo programmatico)

public static void main(String[] args) {
    //magical - do not touch
    @SuppressWarnings("unused")
    org.jboss.logging.Logger logger = org.jboss.logging.Logger.getLogger("org.hibernate");
    java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.WARNING); //or whatever level you need

    ...
}

L'ho usato in un programma tutorial scaricato da questo sito


4

La prima cosa da fare è capire quale framework di registrazione è effettivamente utilizzato.

Molti framework sono già trattati da altri autori sopra. Se stai usando Logback puoi risolvere il problema aggiungendo questo logback.xml al tuo classpath:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <logger name="org.hibernate" level="WARN"/>
</configuration>

Ulteriori informazioni: Logback Manual-Configuration


1

Ho cambiato il "debug" in "info" e ha funzionato. Ecco cosa ho fatto:

Prima:

log4j.rootLogger=debug, stdout, R

Dopo:

log4j.rootLogger=info, stdout, R 


0

Per eliminare l'output del logger nella console, prova questo.

ch.qos.logback.classic.LoggerContext.LoggerContext loggerContext = (LoggerContext) org.slf4j.LoggerFactory.LoggerFactory.getILoggerFactory();

loggerContext.stop();

Queste istruzioni disabilitano tutti gli output della console dal logger.


0

Ci sono diverse parti della registrazione di ibernazione che puoi controllare in base alla gerarchia di logger del pacchetto hibernate (maggiori informazioni sulla gerarchia di logger qui ).

    <!-- Log everything in hibernate -->
    <Logger name="org.hibernate" level="info" additivity="false">
      <AppenderRef ref="Console" />
    </Logger>

    <!-- Log SQL statements -->
    <Logger name="org.hibernate.SQL" level="debug" additivity="false">
      <AppenderRef ref="Console" />
      <AppenderRef ref="File" />
    </Logger>

    <!-- Log JDBC bind parameters -->
    <Logger name="org.hibernate.type.descriptor.sql" level="trace" additivity="false">
      <AppenderRef ref="Console" />
      <AppenderRef ref="File" />
    </Logger>

Quanto sopra è stato preso da qui .

Inoltre potresti avere la proprietà show-sql:truenel tuo file di configurazione poiché sostituisce le impostazioni del framework di registrazione. Maggiori informazioni qui .


0

Sono riuscito a smettere aggiungendo quelle 2 righe

log4j.logger.org.hibernate.orm.deprecation=error

log4j.logger.org.hibernate=error

Di seguito è come appare il mio log4j.properties , lascio solo alcune righe commentate che spiegano il livello di log

# Root logger option
#Level/rules TRACE < DEBUG < INFO < WARN < ERROR < FATAL.
#FATAL: shows messages at a FATAL level only
#ERROR: Shows messages classified as ERROR and FATAL
#WARNING: Shows messages classified as WARNING, ERROR, and FATAL
#INFO: Shows messages classified as INFO, WARNING, ERROR, and FATAL
#DEBUG: Shows messages classified as DEBUG, INFO, WARNING, ERROR, and FATAL
#TRACE : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
#ALL : Shows messages classified as TRACE,DEBUG, INFO, WARNING, ERROR, and FATAL
#OFF : No log messages display


log4j.rootLogger=INFO, file, console

log4j.logger.main=DEBUG
log4j.logger.org.hibernate.orm.deprecation=error
log4j.logger.org.hibernate=error

#######################################
# Direct log messages to a log file
log4j.appender.file.Threshold=ALL
log4j.appender.file.file=logs/MyProgram.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %c{1} - %m%n

# set file size limit
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=50


#############################################
# Direct log messages to System Out
log4j.appender.console.Threshold=INFO
log4j.appender.console.Target=System.out
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c{1} - %m%n
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.