Отключение вывода консоли журналирования спящего режима

85

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

### отправлять сообщения журнала на стандартный вывод ###
# 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

### прямые сообщения в файл 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 = предупреждение, стандартный вывод

# log4j.logger.org.hibernate = info
log4j.logger.org.hibernate = отладка

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

### регистрировать только SQL
# log4j.logger.org.hibernate.SQL = отладка

### журнал параметров привязки 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.
Eye

Ответы:

78

Попробуйте установить более разумный уровень ведения журнала. Установка уровня ведения журнала на infoозначает, что в журнал регистрируются только события журнала infoили более высокого уровня ( warn, errorи fatal), то есть debugсобытия журнала игнорируются.

log4j.logger.org.hibernate=info

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

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

См. Также руководство по log4j .

Юха Сюрьяля
источник
1
Как это сделать в версии XML?
Джеймс МакМахон,
Вы можете применить это ко всем пакетам в org.hibernate, выполнив указанные выше действия, или, если вам нужны разные уровни для разных пакетов в спящем режиме, вы можете указать эти пакеты таким же образом.
Мэтью Брубейкер,
3
Это кажется логичным, но у меня все еще не работает (Spring 3.0.5, Hibernate 3.5.6, мост sf4j-log4j). Я до сих пор получаю около 100 строк комментариев «INFO» при запуске Hibernate. Так что это может не сработать для всех.
Джозеф Ласт
1
@Twisted Pear: установите уровень ведения журнала WARN. Тогда вы не будете получать сообщения INFO.
Juha Syrjälä 01
5
Последующие действия, поскольку эта проблема так и не была решена должным образом: Hibernate, даже в версии 4.3.0.Final, содержит множество жестко запрограммированных System.out.println()вызовов.
chrylis -cautiouslyoptimistic-
86

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

hibernate.show_sql

контролирует ведение журнала непосредственно в STDOUT, минуя любую структуру ведения журнала (которую можно распознать по отсутствующему форматированию вывода сообщений). Если вы используете фреймворк журналирования, такой как log4j, вы всегда должны устанавливать для этого свойства значение false, потому что это не дает вам никаких преимуществ.

Это обстоятельство раздражало меня довольно долгое время, потому что меня это особо не волновало, пока я не попытался написать какой-нибудь тест для Hibernate.

user1050755
источник
2
Мне пришлось установить это свойство в моей hibernate.xmlконфигурации Hibernate (т.е. ), в отличие от моей конфигурации ведения журнала. Спасибо за указатель!
JJ Zabkar
есть ли способ сделать так, чтобы это ведение журнала не обходило мою структуру ведения журнала, а фактически использовало его? Я вижу некоторые исключения, отправленные на стандартный вывод, которые я хочу зарегистрировать.
Легна
1
В моем проекте загрузки Spring я добавил это в файл конфигурации YML профиля. Но это не сработало, как и другие сообщения в этой теме ... Журналы гибернации продолжают записываться, что бы я ни указывал. Можно ли с этим справиться где-нибудь еще, кроме конфигурации Logback, файла yaml приложения и pom.xml?
Alex
34

Выполнение:

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класс, чтобы узнать больше уровней).

acdcjunior
источник
2
Это сработало для меня:java.util.logging.Logger.getLogger("org.hibernate").setLevel(Level.SEVERE);
RafiAlhamd
16

Вы можете отключить многие выходы спящего режима, установив этот реквизит спящего режима (конфигурация hb) как false:

hibernate.show_sql
hibernate.generate_statistics
hibernate.use_sql_comments

Но если вы хотите отключить всю консольную информацию, вы должны установить уровень логгера НЕТ из FATAL класса, org.hibernateкак говорит Юха.

Rresino
источник
Что, если я хочу генерировать статистику, но не вести журнал?
markthegrea
7

Я, наконец, понял, это потому, что Hibernate теперь использует фасад журнала slf4j, чтобы связать с log4j, вам нужно поместить jar-файлы log4j и slf4j-log4j12 в вашу библиотеку, а затем свойства log4j возьмут на себя управление журналами Hibernate.

Моя настройка 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> 
Systfile
источник
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

    ...
}

Я использовал его в учебной программе, скачанной с этого сайта

Матей Варговчик
источник
4

Первое, что нужно сделать, - это выяснить, какая среда ведения журнала используется на самом деле.

Многие фреймворки уже описаны другими авторами выше. Если вы используете 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 
user370677
источник
0

Замените slf4j-jdk14-xxx.jar на slf4j-log4j12-xxx.jar. Если у вас есть оба, удалите slf4j-jdk14-xxx.jar. Нашел это решение на https://forum.hibernate.org/viewtopic.php?f=1&t=999623

Балакришна
источник
отлично, это работает. Я мог использовать log4j.propertiesконфигурацию; log4j.logger.org.hibernate=OFF
Себастьян
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
Филипп
источник