Настройка ведения журнала Hibernate с использованием файла конфигурации Log4j XML?

89

Мне не удалось найти никакой документации о том, как настроить ведение журнала Hibernate с использованием файла конфигурации стиля XML для Log4j.

Возможно ли это, или я должен использовать файл конфигурации стиля свойств для управления ведением журнала Hibernate?

Если у кого-то есть какая-либо информация или ссылки на документацию, это будет полезно.

РЕДАКТИРОВАТЬ:
Чтобы уточнить, я ищу пример фактического синтаксиса XML для управления Hibernate.

EDIT2:
вот что у меня есть в моем файле конфигурации XML.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="info"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="1000KB"/>
    <!-- Keep one backup file -->
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

Ведение журнала работает нормально, но я ищу способ уйти и контролировать ведение журнала гибернации способом, отличным от ведения журнала на уровне приложения, поскольку в настоящее время он наводняет мои журналы. Я нашел примеры использования файла настроек для этого, мне просто было интересно, как я могу сделать это в файле XML.

Джеймс МакМахон
источник
Немо, ты когда-нибудь узнал, как это сделать с помощью xml? Возможно, вы могли бы опубликовать ответ на свой вопрос, если бы сделали это.
homaxto
homaxto, я сделал. Я отправлю это тебе, как только у меня будет возможность.
Джеймс МакМахон,
<appender-ref ref = "console" /> делает так, что журнал гибернации переходит также в catalina.out, вам следует прокомментировать этот тег, если вы не хотите видеть catalina.out, полный журналов гибернации
Энрике Сан Мартин

Ответы:

162

Из http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging

Вот список категорий логгеров:

Category                    Function

org.hibernate.SQL           Log all SQL DML statements as they are executed
org.hibernate.type          Log all JDBC parameters
org.hibernate.tool.hbm2ddl  Log all SQL DDL statements as they are executed
org.hibernate.pretty        Log the state of all entities (max 20 entities) associated with the session at flush time
org.hibernate.cache         Log all second-level cache activity
org.hibernate.transaction   Log transaction related activity
org.hibernate.jdbc          Log all JDBC resource acquisition
org.hibernate.hql.ast.AST   Log HQL and SQL ASTs during query parsing
org.hibernate.secure        Log all JAAS authorization requests
org.hibernate               Log everything (a lot of information, but very useful for troubleshooting) 

Отформатирован для вставки в XML-файл конфигурации log4j:

<!-- Log all SQL DML statements as they are executed -->
<Logger name="org.hibernate.SQL" level="debug" />
<!-- Log all JDBC parameters -->
<Logger name="org.hibernate.type" level="debug" />
<!-- Log all SQL DDL statements as they are executed -->
<Logger name="org.hibernate.tool.hbm2ddl" level="debug" />
<!-- Log the state of all entities (max 20 entities) associated with the session at flush time -->
<Logger name="org.hibernate.pretty" level="debug" />
<!-- Log all second-level cache activity -->
<Logger name="org.hibernate.cache" level="debug" />
<!-- Log transaction related activity -->
<Logger name="org.hibernate.transaction" level="debug" />
<!-- Log all JDBC resource acquisition -->
<Logger name="org.hibernate.jdbc" level="debug" />
<!-- Log HQL and SQL ASTs during query parsing -->
<Logger name="org.hibernate.hql.ast.AST" level="debug" />
<!-- Log all JAAS authorization requests -->
<Logger name="org.hibernate.secure" level="debug" />
<!-- Log everything (a lot of information, but very useful for troubleshooting) -->
<Logger name="org.hibernate" level="debug" />

NB: большинство регистраторов используют уровень DEBUG, однако org.hibernate.type использует TRACE. В предыдущих версиях Hibernate org.hibernate.type также использовалась DEBUG, но в Hibernate 3 вы должны установить уровень TRACE (или ALL), чтобы увидеть регистрацию привязки параметров JDBC.

И категория указывается как таковая:

<logger name="org.hibernate">
    <level value="ALL" />
    <appender-ref ref="FILE"/>
</logger>

Его необходимо разместить перед корневым элементом.

Локи
источник
Я не уверен, что там делает <appender-ref>, когда я меняю его на приложение в своей конфигурации, спящий режим все еще, кажется, регистрируется как в консоли, так и в моем файловом приложении. Странный.
Джеймс МакМахон,
Это странно, в Hibernate 3.2.6 для org.hibernate.type вы можете использовать уровень DEBUG, и он регистрирует все параметры. В спящем режиме 3.5.6 DEBUG недостаточно, вам нужно поставить TRACE, что IMHO нормально (как только вы это узнаете), поскольку он действительно много регистрирует!
Риккардо Коссу,
Имя класса было переработано в Hibernate 4.2, поэтому для ведения журнала транзакций вы должны использовать org.hibernate.engine.transaction. См .: docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/…
gerrytan
Вы также можете добавить регистраторы в standalone.xml, как показано ниже: <logger categoryoriy = "org.hibernate"> <level name = "DEBUG" /> </logger>
cw24
1
Следует ли L, например, на <Logger name="org.hibernate.SQL" level="debug" />самом деле использовать заглавные буквы? Я получаю сообщение об ошибке в Tomcat при запуске при использовании заглавной буквы L : "The content of element type 'log4j:configuration' must match '(renderer*,throwableRenderer*,appender*,plugin*,(category|logger)*,root?,(categoryFactory|loggerFactory)?)'.". Я также не понимаю, как это должно быть введено в мой файл log4j.xml. Должен ли я иметь отдельный <logger>блок для каждой категории с <level>тегами, или мне можно обойтись однострочниками, которые вы представили?
MegaMatt
25

Loki «s ответ указывает на документы Hibernate 3 и обеспечивает хорошую информацию, но я до сих пор не получают результаты , которые я ожидал.

Из-за долгих ударов, размахивания руками и бега дохлой мыши я наконец получил свой сыр.

Поскольку Hibernate 3 использует Simple Logging Facade для Java (SLF4J) (согласно документации), если вы полагаетесь на Log4j 1.2, вам также понадобится slf4j-log4j12-1.5.10.jar, если вы хотите полностью настроить ведение журнала Hibernate с файл конфигурации log4j. Надеюсь, это поможет следующему парню.

Деннис С
источник
Ага, вам нужен файл slf4j-log4j12-1.5.10.jar для подключения фасада к нижележащему уровню ведения журнала. Файл конфигурации по-прежнему является конфигурацией log4j, если вы используете log4j в качестве уровня ведения журнала.
Джеймс МакМахон,
7

В ответ на комментарий homaxto, это то, что у меня есть прямо сейчас.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="debug"/>
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/>
        </layout>
    </appender>
    <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="Program-Name.log"/>
        <param name="MaxFileSize" value="500KB"/>
        <param name="MaxBackupIndex" value="4"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n"/>
        </layout>
    </appender>

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

    <root>
        <priority value ="debug" />
        <appender-ref ref="console" />
        <appender-ref ref="rolling-file" />
    </root>
</log4j:configuration>

Ключевая часть

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

Надеюсь это поможет.

Джеймс МакМахон
источник
5

Вот что я использую:

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

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

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

<root>
    <priority value="info"/>
    <appender-ref ref="C1"/>
</root> 

Очевидно, мне не нравится видеть сообщения Hibernate;) - установите уровень «отладка», чтобы получить результат.

TMN
источник
3

Ответы были полезны. После изменения я получил дублирующуюся запись операторов SQL, одну в файл журнала log4j и одну в стандартную консоль. Я изменил файл persistence.xml, чтобы указать show_sql на false, чтобы избавиться от ведения журнала из стандартной консоли. Сохранение значения format_sql также влияет на файл журнала log4j, поэтому я оставил это верным.

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">
    <persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:d:\temp\database\cap1000;shutdown=true"></property>
            <property name="dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>
</persistence>
dc360
источник
0

Вы можете настроить свой log4jфайл с помощью тега категории следующим образом (например, с помощью консольного приложения):

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yy-MM-dd HH:mm:ss} %p %c - %m%n" />
    </layout>
</appender>
<category name="org.hibernate">
    <priority value="WARN" />
</category>
<root>
    <priority value="INFO" />
    <appender-ref ref="console" />
</root>

Таким образом, каждое предупреждение, сообщение об ошибке или фатальное сообщение из спящего режима будет отображаться, не более того. Кроме того, ваш код и код библиотеки будут на информационном уровне (так что информация, предупреждение, ошибка и фатальный)

Чтобы изменить уровень журнала библиотеки, просто добавьте категорию, например, в журнал неактивной информации Spring:

<category name="org.springframework">
    <priority value="WARN" />
</category>

Или с другим приложением, сломайте аддитивность (значение аддитивности по умолчанию истинно)

<category name="org.springframework" additivity="false">
    <priority value="WARN" />
    <appender-ref ref="anotherAppender" />
</category>

И если вы не хотите, чтобы этот спящий режим регистрировал каждый запрос, установите для свойства hibernate show_sqlзначение false.

Эмильен Бриганд
источник