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

StackOverflow https://stackoverflow.com/questions/436276

Вопрос

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

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

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

Редактировать:
Просто чтобы уточнить, я ищу пример фактического синтаксиса XML для управления гибернацией.

РЕДАКТИРОВАТЬ 2:
Вот что у меня есть в моем 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-файле.

Это было полезно?

Решение

От 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" />

Примечание:Большинство регистраторов используют уровень ОТЛАДКИ, однако org.hibernate.type использует ТРАССИРОВКУ.В предыдущих версиях Hibernate org.hibernate.type также использовался DEBUG, но начиная с Hibernate 3, вы должны установить уровень TRACE (или ALL), чтобы увидеть ведение журнала привязки параметра JDBC.

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

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

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

Другие советы

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

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

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

В ответ на комментарий 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>

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

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

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

Очевидно, мне не нравится видеть сообщения из гибернации ;) - установите уровень "debug", чтобы получить выходные данные.

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

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

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

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

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

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

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

Или с помощью другого приложения нарушьте аддитивность (значение аддитивности по умолчанию равно true).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top