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

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 .


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.


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


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.


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>

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> 

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


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


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 


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.


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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.