Настройка ведения журнала Hibernate с помощью XML-файла конфигурации Log4j? - PullRequest
84 голосов
/ 12 января 2009

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

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

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

EDIT:
Просто чтобы уточнить, я ищу пример фактического синтаксиса 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.

Ответы [ 6 ]

152 голосов
/ 12 января 2009

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

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

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

Примечание: большинство регистраторов используют уровень 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>

Он должен быть расположен перед корневым элементом.

25 голосов
/ 25 февраля 2010

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

Сильное избиение, взмахи руками и вообще убитые мышиные удары, наконец, принесли мне мой сыр.

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

7 голосов
/ 06 февраля 2009

В ответ на комментарий 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 голосов
/ 12 марта 2009

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

<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;) - установите уровень "debug", чтобы получить вывод.

3 голосов
/ 25 июля 2012

Ответы были полезны. После внесения изменений я получил двойную запись операторов SQL, одну в файле журнала log4j и одну на стандартной консоли. Я изменил файл persistence.xml, указав show_sql на false, чтобы избавиться от регистрации в стандартной консоли. Значение true для 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>
0 голосов
/ 08 октября 2013

Вы можете настроить свой файл 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>

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

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

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

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

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

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

...