Вимкнення виводу консолі журналу сплячого режиму


84

Я використовую hibernate 3 і хочу зупинити його від скидання всіх повідомлень про запуск на консоль. Я спробував прокоментувати рядки stdout у log4j.properties, але не пощастило. Я вставив свій журнал нижче. Також я використовую eclipse зі стандартною структурою проекту і маю копію log4j.properties як у кореневій папці проекту, так і в папці bin.

### прямі повідомлення журналу до 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 {АБСОЛЮТНО}% 5p% c {1}:% L -% m% n

### прямі повідомлення у файл 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

### встановити рівні журналу - для більш детального журналювання змініть 'info' на 'debug' ###

log4j.rootLogger = попередження, stdout

# log4j.logger.org.hibernate = інформація
log4j.logger.org.hibernate = налагодження

### реєструвати активність синтаксичного аналізу запитів HQL
# log4j.logger.org.hibernate.hql.ast.AST = налагодження

### реєструвати лише SQL
# log4j.logger.org.hibernate.SQL = налагодження

### log JDBC параметри прив'язки ###
log4j.logger.org.hibernate.type = інформація
# log4j.logger.org.hibernate.type = налагодження

### схема експорту / оновлення журналу ###
log4j.logger.org.hibernate.tool.hbm2ddl = налагодження

### реєструвати дерева синтаксичного аналізу HQL
# log4j.logger.org.hibernate.hql = налагодження

### активність кешу журналу ###
# log4j.logger.org.hibernate.cache = налагодження

### діяльність транзакції журналу
# log4j.logger.org.hibernate.transaction = налагодження

### журнал Збір ресурсів JDBC
# log4j.logger.org.hibernate.jdbc = налагодження

### увімкніть наступний рядок, якщо ви хочете відстежити підключення ###
### витоки під час використання DriverManagerConnectionProvider ###
# log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider = trac5

2
Варто згадати, що Hibernate 4+ використовує протоколювання JBOSS.
Око

Відповіді:


77

Спробуйте встановити більш розумний рівень реєстрації. Встановлення рівня реєстрації infoозначає, що реєструються лише події журналу на infoрівні або вище ( warn, errorі fatal), тобто debugподії реєстрації ігноруються.

log4j.logger.org.hibernate=info

або у XML-версії конфігураційного файлу log4j:

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

Див. Також посібник log4j .


1
Як це зробити у версії XML?
James McMahon

Ви можете застосувати це до всіх пакунків в org.hibernate, виконавши вищезазначене, або якщо ви хочете, щоб різні рівні для різних пакетів у сплячому режимі, ви можете вказати ці пакети однаково.
Matthew Brubaker

3
Це здається логічним, але все ще не працює для мене (Spring 3.0.5, Hibernate 3.5.6, sf4j-log4j bridge). Я все ще отримую близько 100 рядків коментарів "INFO" щодо запуску Hibernate щоразу. Тож це може працювати не для всіх.
Джозеф Луст

1
@Twisted Pear: встановіть рівень реєстрації на ПОПЕРЕДЖЕННЯ. Тоді ви не отримуватимете інформаційні повідомлення.
Juha Syrjälä

5
Подальші дії, оскільки це ніколи не було адекватно вирішено: Hibernate, навіть все ще в 4.3.0.Final, має багато жорстко закодованих System.out.println()дзвінків.
chrisis

85

Важливе зауваження: властивість (частина конфігурації сплячого режиму, НЕ частина конфігурації фреймворку!)

hibernate.show_sql

керує веденням журналу безпосередньо в STDOUT, обминаючи будь-яку структуру ведення журналу (яку ви можете впізнати за відсутнім вихідним форматуванням повідомлень). Якщо ви використовуєте фреймворк ведення журналу, як log4j, вам слід завжди встановлювати для цього властивості значення false, оскільки це взагалі не дає вам ніякої вигоди.

Ця обставина дратувала мене досить довго, бо я ніколи про це не піклувався, поки не спробував написати якийсь орієнтир щодо сплячого режиму.


2
Мені довелося встановити цю властивість у моїй hibernate.xmlконфігурації Hibernate (тобто ), на відміну від моєї конфігурації реєстрації. Дякую за вказівник!
JJ Zabkar,

чи є спосіб, щоб цей журнал не обходив мою структуру ведення журналу, а насправді використовував його? Я бачу деякі винятки, надіслані в stdout, які я хотів би зареєструвати.
Легна

1
У своєму проекті завантаження Spring я додав це у файл конфігурації YML профілю. Але це не спрацювало, як і інші публікації в цій темі ... Журнали Hibernate продовжують писатись, що б я не вказав. Чи можна з ним обробляти десь ще, крім конфігурації журналу, файлу yaml програми та pom.xml?
Олексій

33

Виконання:

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

до ініціалізації сплячого режиму працював у мене.


Примітка: у рядку вище буде вимкнено кожен вихід ( Level.OFF). Якщо ви хочете бути менш суворими, ви можете використовувати

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

це досить тихо. (Або перевірте java.util.logging.Levelклас на інші рівні).


1
Це спрацювало для мене:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
РафіАлхамд,

16

Ви можете вимкнути багато з результатів сплячого режиму, встановивши для цього реквізиту сплячого режиму (конфігурація hb) значення false:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Але якщо ви хочете відключити всю інформацію про консоль, ви повинні встановити рівень реєстратора НІКОГО з FATAL класу, org.hibernateяк сказав Юха.


Що робити, якщо я хочу генерувати статистику, але не реєструвати?
markthegrea

7

Нарешті я зрозумів, це тому, що Hibernate зараз використовує фасад журналу slf4j, щоб перейти до log4j, вам потрібно поставити банки log4j та slf4j-log4j12 у вашу бібліотеку, і тоді властивості log4j візьмуть під свій контроль журнали сплячого режиму.

Моє налаштування pom.xml виглядає так:

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

Насправді ви можете явно змусити Hibernate використовувати slf4j, додавши -Dorg.jboss.logging.provider=slf4jдо параметрів віртуальної машини. Я написав статтю на цю тему: medium.com/@scadge/how-to-enable-hibernate-logging-dc11545efd3d
Scadge

5

Для вимкнення Hibernate:selectповідомлення в журналі можна встановити властивість у HibernateJpaVendorAdapter:

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

4

Для тих, хто не хоче елегантних рішень, просто швидкий і брудний спосіб зупинити ці повідомлення, ось рішення, яке працювало для мене (я використовую Hibernate 4.3.6 та Eclipse, і жодних відповідей, наведених вище (або знайдених в Інтернеті) не працював; ні файли конфігурації log4j, ні програмне встановлення рівня реєстрації)

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

    ...
}

Я використав його в програмі-підручнику, завантаженій із цього веб-сайту


3

Перше, що потрібно зробити, це з’ясувати, яка система реєстрації журналів фактично використовується.

Багато рамок вже висвітлено іншими авторами вище. Якщо ви використовуєте Logback, ви можете вирішити проблему, додавши logback.xml до шляху до класу :

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

Додаткова інформація: Посібник із налаштування зворотного зв’язку - налаштування


1

Я змінив "налагодження" на "інформація", і це спрацювало. Ось що я зробив:

До:

log4j.rootLogger=debug, stdout, R

Після:

log4j.rootLogger=info, stdout, R 


0

Щоб позбутися результатів реєстрації в консолі, спробуйте це.

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

loggerContext.stop();

Ці оператори вимкнули всі вихідні дані консолі з реєстратора.


0

Існує декілька частин журналу сплячого режиму, якими ви можете керувати, виходячи з ієрархії реєстратора пакета зимового сну (докладніше про ієрархію реєстратора тут ).

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

Вище сказане було взято звідси .

Крім того, ви можете мати властивість show-sql:trueу вашому конфігураційному файлі, оскільки це витісняє параметри фреймвордингу. Детальніше про це тут .


0

Мені вдалося зупинитися, додавши ці 2 рядки

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

log4j.logger.org.hibernate=error

Нижче - як виглядає моя log4j.properties , я просто залишаю кілька коментованих рядків, що пояснюють рівень журналу

# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.