Deaktivieren der Ausgabe der Protokollierungskonsole im Ruhezustand


83

Ich verwende den Ruhezustand 3 und möchte verhindern, dass alle Startmeldungen an die Konsole gesendet werden. Ich habe versucht, die Standardzeilen in log4j.properties zu kommentieren, aber kein Glück. Ich habe meine Protokolldatei unten eingefügt. Außerdem verwende ich Eclipse mit der Standardprojektstruktur und habe eine Kopie von log4j.properties sowohl im Stammverzeichnis des Projektordners als auch im Ordner bin.

### direkte Protokollnachrichten an 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 {ABSOLUT}% 5p% c {1}:% L -% m% n

### direkte Nachrichten an die Datei 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 {ABSOLUTE% 5p% c {1}:% L -% m% n

### Protokollstufen festlegen - für eine ausführlichere Protokollierung ändern Sie 'info' in 'debug' ###

log4j.rootLogger = warn, stdout

# log4j.logger.org.hibernate = info
log4j.logger.org.hibernate = Debug

### HQL-Abfrage-Parser-Aktivität protokollieren
# log4j.logger.org.hibernate.hql.ast.AST = debug

### protokolliere nur die SQL
# log4j.logger.org.hibernate.SQL = Debug

### log JDBC-Bindungsparameter ###
log4j.logger.org.hibernate.type = info
# log4j.logger.org.hibernate.type = debug

### Protokollschema exportieren / aktualisieren ###
log4j.logger.org.hibernate.tool.hbm2ddl = debug

### log HQL-Analysebäume
# log4j.logger.org.hibernate.hql = debuggen

### Cache-Aktivität protokollieren ###
# log4j.logger.org.hibernate.cache = debug

### Protokolltransaktionsaktivität
# log4j.logger.org.hibernate.transaction = debug

### Protokoll JDBC-Ressourcenerfassung
# log4j.logger.org.hibernate.jdbc = debug

### Aktivieren Sie die folgende Zeile, wenn Sie die Verbindung aufspüren möchten ###
### Leckagen bei Verwendung von DriverManagerConnectionProvider ###
# log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider = trac5

2
Erwähnenswert ist, dass Hibernate 4+ die JBOSS-Protokollierung verwendet.
Auge

Antworten:


77

Versuchen Sie, eine vernünftigere Protokollierungsstufe festzulegen. Wenn Sie die Protokollierungsstufe auf infofestlegen, werden nur Protokollereignisse auf infooder einer höheren Ebene ( warn, errorund fatal) protokolliert, dh debugProtokollierungsereignisse werden ignoriert.

log4j.logger.org.hibernate=info

oder in der XML-Version der log4j-Konfigurationsdatei:

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

Siehe auch log4j Handbuch .


1
Wie macht man das in der XML-Version?
James McMahon

Sie können dies auf alle Pakete in org.hibernate anwenden, indem Sie die oben beschriebenen Schritte ausführen. Wenn Sie unterschiedliche Ebenen für verschiedene Pakete im Ruhezustand wünschen, können Sie diese Pakete auf dieselbe Weise angeben.
Matthew Brubaker

3
Dies scheint logisch, funktioniert aber immer noch nicht für mich (Spring 3.0.5, Hibernate 3.5.6, sf4j-log4j Bridge). Ich erhalte immer noch jedes Mal ungefähr 100 Zeilen mit 'INFO'-Kommentaren zum Start des Ruhezustands. Dies funktioniert möglicherweise nicht für alle.
Joseph Lust

1
@ Twisted Pear: Stellen Sie Ihre Protokollierungsstufe auf WARN. Dann erhalten Sie keine INFO-Nachrichten.
Juha Syrjälä

5
Follow-up, da dies nie angemessen gelöst wurde: Der Ruhezustand, auch noch in 4.3.0.Final, hat viele fest codierte System.out.println()Anrufe.
Chrylis

84

Wichtiger Hinweis: Die Eigenschaft (Teil der Konfiguration im Ruhezustand, NICHT Teil der Konfiguration des Protokollierungsframeworks!)

hibernate.show_sql

steuert die Protokollierung direkt in STDOUT unter Umgehung eines Protokollierungsframeworks (was Sie an der fehlenden Ausgabeformatierung der Nachrichten erkennen können). Wenn Sie ein Logging - Framework wie log4j verwenden, sollten Sie immer diese Eigenschaft auf false gesetzt , weil es Ihnen keinen Nutzen überhaupt gibt.

Dieser Umstand irritierte mich ziemlich lange, weil ich mich nie wirklich darum kümmerte, bis ich versuchte, einen Benchmark in Bezug auf den Ruhezustand zu schreiben.


2
Ich musste diese Eigenschaft in meiner hibernate.xmlKonfiguration für den Ruhezustand (dh ) im Gegensatz zu meiner Protokollierungskonfiguration festlegen. Danke für den Zeiger!
JJ Zabkar

Gibt es eine Möglichkeit, diese Protokollierung so zu gestalten, dass mein Protokollierungsframework nicht umgangen, sondern tatsächlich verwendet wird? Ich sehe einige Ausnahmen an den Standard gesendet, die ich protokollieren möchte.
Legna

1
Bei meinem Spring-Boot-Projekt habe ich dies in eine Profil-YML-Conf-Datei eingefügt. Aber es hat nicht funktioniert, genau wie die anderen Beiträge in diesem Thread ... Hibernate-Protokolle werden immer wieder geschrieben, egal was ich spezifiziere. Kann es woanders als in der Logback-Konfiguration, der Anwendungs-Yaml-Datei und der pom.xml gehandhabt werden?
Alex

32

Ausführen:

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

bevor die Initialisierung des Ruhezustands für mich funktionierte.


Hinweis: In der obigen Zeile wird jede Abmeldung deaktiviert ( Level.OFF). Wenn Sie weniger streng sein möchten, können Sie verwenden

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

das ist still genug. (Oder überprüfen Sie die java.util.logging.LevelKlasse für weitere Ebenen).


16

Sie können die vielen Ausgänge des Ruhezustands deaktivieren, indem Sie diese Requisiten für den Ruhezustand (hb-Konfiguration) auf false setzen:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Wenn Sie jedoch alle Konsoleninformationen deaktivieren möchten, müssen Sie die Logger-Ebene auf NONE of FATAL der Klasse einstellen, org.hibernatewie Juha sagt.


Was ist, wenn ich Statistiken erstellen, aber nicht protokollieren möchte?
Markthegrea

7

Ich habe es endlich herausgefunden, weil der Ruhezustand jetzt die slf4j-Protokollfassade verwendet. Um eine Brücke zu log4j zu schlagen, müssen Sie log4j- und slf4j-log4j12-Jars in Ihre Bibliothek einfügen, und dann übernehmen die log4j-Eigenschaften die Kontrolle über die Ruhezustandsprotokolle.

Meine pom.xml-Einstellung sieht wie folgt aus:

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

Tatsächlich können Sie Hibernate dazu bringen, slf4j explizit zu verwenden, indem Sie -Dorg.jboss.logging.provider=slf4jIhren VM-Optionen hinzufügen . Ich schrieb einen Artikel zum Thema: medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge

5

Zum Deaktivieren der Hibernate:selectNachricht im Protokoll können Sie die Eigenschaft wie folgt festlegen HibernateJpaVendorAdapter:

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

4

Für diejenigen, die keine eleganten Lösungen wollen, nur eine schnelle und schmutzige Möglichkeit, diese Nachrichten zu stoppen, ist hier eine Lösung, die für mich funktioniert hat (ich verwende Hibernate 4.3.6 und Eclipse und keine Antworten oben (oder im Internet gefunden)). funktioniert; weder log4j-Konfigurationsdateien noch programmgesteuertes Einstellen der Protokollierungsstufe)

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

    ...
}

Ich habe es in einem Tutorial-Programm verwendet, das von dieser Site heruntergeladen wurde


3

Als erstes müssen Sie herausfinden, welches Protokollierungsframework tatsächlich verwendet wird.

Viele Frameworks werden bereits von anderen Autoren oben behandelt. Wenn Sie Logback verwenden, können Sie das Problem lösen, indem Sie diese logback.xml zu Ihrem Klassenpfad hinzufügen :

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

Weitere Informationen: Logback Manual-Konfiguration


1

Ich habe das "Debug" in "Info" geändert und es hat funktioniert. Folgendes habe ich getan:

Vor:

log4j.rootLogger=debug, stdout, R

Nach dem:

log4j.rootLogger=info, stdout, R 


0

Versuchen Sie dies, um die Logger-Ausgabe in der Konsole zu entfernen.

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

loggerContext.stop();

Diese Anweisungen deaktivierten alle Konsolenausgaben von Logger.


0

Es gibt verschiedene Teile der Ruhezustandsprotokollierung, die Sie basierend auf der Protokollierungshierarchie des Ruhezustandspakets steuern können (mehr zur Protokollierungshierarchie hier ).

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

Das obige wurde von hier genommen .

Außerdem könnten Sie die Eigenschaft show-sql:truein Ihrer Konfigurationsdatei haben, da dies die Einstellungen des Protokollierungsframeworks ersetzt. Mehr dazu hier .


0

Ich konnte aufhören, indem ich diese 2 Zeilen hinzufügte

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

log4j.logger.org.hibernate=error

Unten sehen meine log4j.properties aus. Ich hinterlasse nur einige kommentierte Zeilen, in denen die Protokollstufe erläutert wird

# 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.