Wyłączam wyjście konsoli logowania hibernacji

84

Używam hibernacji 3 i chcę powstrzymać ją przed zrzucaniem wszystkich wiadomości startowych na konsolę. Próbowałem wykomentować linie stdout w log4j.properties, ale bez powodzenia. Wklejam mój plik dziennika poniżej. Używam również eclipse ze standardową strukturą projektu i mam kopię log4j.properties zarówno w katalogu głównym folderu projektu, jak iw folderze bin.

### bezpośrednie komunikaty dziennika na standardowe wyjście ###
# 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

### bezpośrednie wiadomości do pliku 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

### ustaw poziomy dziennika - aby uzyskać bardziej szczegółowe rejestrowanie, zmień „informacje” na „debugowanie” ###

log4j.rootLogger = warn, stdout

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

### log aktywność parsera zapytań HQL
# log4j.logger.org.hibernate.hql.ast.AST = debug

### rejestruj tylko SQL
# log4j.logger.org.hibernate.SQL = debuguj

### log Parametry wiązania JDBC ###
log4j.logger.org.hibernate.type = info
# log4j.logger.org.hibernate.type = debuguj

### eksport / aktualizacja schematu dziennika ###
log4j.logger.org.hibernate.tool.hbm2ddl = debug

### log HQL parse drzew
# log4j.logger.org.hibernate.hql = debuguj

### aktywność pamięci podręcznej dziennika ###
# log4j.logger.org.hibernate.cache = debuguj

### rejestruj aktywność transakcji
# log4j.logger.org.hibernate.transaction = debuguj

### log pozyskiwanie zasobów JDBC
# log4j.logger.org.hibernate.jdbc = debuguj

### włącz następujący wiersz, jeśli chcesz wyśledzić połączenie ###
### wycieki podczas korzystania z DriverManagerConnectionProvider ###
# log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider = trac5
Jared
źródło
2
Warto wspomnieć, że Hibernate 4+ wykorzystuje logowanie JBOSS.
Eye

Odpowiedzi:

77

Spróbuj ustawić bardziej rozsądny poziom rejestrowania. Ustawianie poziomu logowania do infośrodków, które tylko w dzienniku zdarzeń infolub wyższy poziom ( warn, errori fatal) są rejestrowane, że jest debugrejestrowanie zdarzeń są ignorowane.

log4j.logger.org.hibernate=info

lub w wersji XML pliku konfiguracyjnego log4j:

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

Zobacz także podręcznik log4j .

Juha Syrjälä
źródło
1
Jak to robisz w wersji XML?
James McMahon
Możesz to zastosować do wszystkich pakietów w org.hibernate, wykonując powyższe czynności, lub jeśli chcesz mieć różne poziomy dla różnych pakietów w ramach hibernacji, możesz określić te pakiety w ten sam sposób.
Matthew Brubaker,
3
Wydaje się to logiczne, ale nadal nie działa dla mnie (wiosna 3.0.5, Hibernate 3.5.6, most sf4j-log4j). Za każdym razem otrzymuję około 100 linijek komentarzy „INFO” na temat uruchamiania Hibernate. Więc to może nie działać dla wszystkich.
Joseph Lust
1
@Twisted Pear: ustaw poziom logowania na WARN. Wtedy nie otrzymasz wiadomości INFO.
Juha Syrjälä
5
Kontynuacja, ponieważ nigdy nie zostało to odpowiednio rozwiązane: Hibernacja, nawet w wersji 4.3.0.Final, ma wiele zakodowanych System.out.println()połączeń.
chrylis
85

Ważna uwaga: właściwość (część konfiguracji hibernacji, NIE część konfiguracji struktury rejestrowania!)

hibernate.show_sql

kontroluje rejestrowanie bezpośrednio do STDOUT z pominięciem jakiejkolwiek struktury rejestrowania (którą można rozpoznać po brakującym formatowaniu wyjściowym komunikatów). Jeśli używasz struktury rejestrowania, takiej jak log4j, zawsze powinieneś ustawić tę właściwość na false, ponieważ nie daje to żadnych korzyści.

Ta okoliczność irytowała mnie dość długo, ponieważ nigdy nie przejmowałem się tym, dopóki nie spróbowałem napisać jakiegoś testu porównawczego dotyczącego Hibernate.

user1050755
źródło
2
Musiałem ustawić tę właściwość w mojej hibernate.xmlkonfiguracji Hibernate (tj. ), W przeciwieństwie do mojej konfiguracji logowania. Dzięki za wskazówkę!
JJ Zabkar
czy istnieje sposób, aby to rejestrowanie nie pomijało przebiegu mojego mechanizmu rejestrowania, ale faktycznie go używało? Widzę kilka wyjątków wysłanych do standardowego wyjścia, które chciałbym zarejestrować.
Legna
1
W moim projekcie startowym Spring dodałem to w pliku konfiguracyjnym YML profilu. Ale to nie zadziałało, tak jak inne posty w tym wątku ... Dzienniki hibernacji są zapisywane bez względu na to, co określę. Czy można to obsłużyć w innym miejscu niż konfiguracja Logback, plik yaml aplikacji i pom.xml?
Alex
33

Wykonywanie:

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

zanim inicjalizacja hibernacji zadziałała dla mnie.


Uwaga: powyższa linia spowoduje wyłączenie każdego logowania ( Level.OFF). Jeśli chcesz być mniej rygorystyczny, możesz użyć

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

to jest wystarczająco ciche. (Lub sprawdź java.util.logging.Levelklasę, aby uzyskać więcej poziomów).

acdcjunior
źródło
1
To zadziałało dla mnie:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
RafiAlhamd
16

Możesz wyłączyć wiele wyjść hibernacji, ustawiając tę ​​właściwość hibernacji (konfiguracja HB) na fałsz:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Ale jeśli chcesz wyłączyć wszystkie informacje o konsoli, musisz ustawić poziom loggera na NONE of FATAL, org.hibernatejak mówi Juha.

rresino
źródło
A jeśli chcę generować statystyki, ale nie loguję?
markthegrea
7

W końcu doszedłem do wniosku, że Hibernate używa teraz elewacji dziennika slf4j, aby połączyć się z log4j, musisz umieścić log4j i slf4j-log4j12 jars w swojej bibliotece, a następnie właściwości log4j przejmą kontrolę nad dziennikami Hibernate.

Moje ustawienie pom.xml wygląda jak poniżej:

    <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>
Liqun Chen
źródło
Właściwie możesz sprawić, by Hibernate używał slf4j jawnie, dodając -Dorg.jboss.logging.provider=slf4jdo opcji maszyny wirtualnej. Napisałem artykuł na ten temat: medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge
5

W celu wyłączenia Hibernate:selectwiadomości w logu można ustawić właściwość na HibernateJpaVendorAdapter:

<bean id="jpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="showSql" value="false"/>
</bean> 
Systfile
źródło
4

Dla tych, którzy nie chcą eleganckich rozwiązań, tylko szybkiego i brudnego sposobu na zatrzymanie tych wiadomości, oto rozwiązanie, które zadziałało dla mnie (używam Hibernate 4.3.6 i Eclipse i brak odpowiedzi podanych powyżej (lub znalezionych w Internecie) działało; ani pliki konfiguracyjne log4j, ani programowe ustawianie poziomu logowania)

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

    ...
}

Użyłem go w samouczku pobranym z tej strony

Matej Vargovčík
źródło
3

Pierwszą rzeczą do zrobienia jest ustalenie, która platforma rejestrowania jest faktycznie używana.

Wiele ram zostało już opisanych przez innych autorów powyżej. Jeśli używasz Logback, możesz rozwiązać problem, dodając to plik logback.xml do swojej ścieżki klas:

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

Dalsze informacje: Logback ręczna konfiguracja

Christian Hoffmann
źródło
1

Zmieniłem „debugowanie” na „informacje” i zadziałało. Oto co zrobiłem:

Przed:

log4j.rootLogger=debug, stdout, R

Po:

log4j.rootLogger=info, stdout, R 
user370677
źródło
0

Zamień slf4j-jdk14-xxx.jar na slf4j-log4j12-xxx.jar. Jeśli masz oba, usuń slf4j-jdk14-xxx.jar. Znalazłem to rozwiązanie na https://forum.hibernate.org/viewtopic.php?f=1&t=999623

Balakrishna
źródło
świetnie, to działa. Mógłbym użyć log4j.propertieskonfiguracji; log4j.logger.org.hibernate=OFF
Sebastian,
0

Aby pozbyć się danych wyjściowych rejestratora w konsoli, spróbuj tego.

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

loggerContext.stop();

Te instrukcje wyłączały wszystkie dane wyjściowe konsoli z programu rejestrującego.

Ramesh Gowtham
źródło
0

Istnieje kilka części rejestrowania hibernacji, które można kontrolować w oparciu o hierarchię rejestratorów pakietu hibernacji (więcej o hierarchii rejestratorów tutaj ).

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

Powyższe zostało zaczerpnięte stąd .

Ponadto właściwość można umieścić show-sql:truew pliku konfiguracyjnym, ponieważ zastępuje ona ustawienia struktury rejestrowania. Więcej na ten temat tutaj .

Chris Meyer
źródło
0

Udało mi się zatrzymać, dodając te 2 linie

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

log4j.logger.org.hibernate=error

Poniżej jest to, jak wygląda mój log4j.properties , zostawiam tylko skomentowane linie wyjaśniające poziom dziennika

# 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
Philippe
źródło