2012-02-24 2 views
4

У меня есть небольшая проблема с моей конфигурацией регистрации hibernate. В нашем приложении у нас есть два потока, которые пытаются одновременно установить блокировку для каждой строки таблицы базы данных. , иногда один из этих потоков пытается заблокировать строку, которая уже заблокирована. Эта ошибка возникает:перенаправление Hibernate Ошибка из моего файла SystemOut.log

[2/24/12 15:00:34:492 CET] 0000003a JDBCException W org.hibernate.util.JDBCExceptionReporter logExceptions SQL Error: 54, SQLState: 61000 
[2/24/12 15:00:34:496 CET] 0000003a JDBCException E org.hibernate.util.JDBCExceptionReporter logExceptions ORA-00054: resource busy and acquire with NOWAIT specified 

эти строки помещаются в файлы SystemOut.log. Я пытаюсь поместить их в другой файл. Так что в моем файле конфигурации Log4j, я создал новый Appender вроде этого:

<appender name="JDBCExceptionReporter" class="org.apache.log4j.RollingFileAppender"> 
    <param name="Encoding" value="UTF-8"/> 
    <param name="File" value="JDBCExceptionReporter.log"/> 
    <param name="MaxFileSize" value="50000KB"/> 
    <param name="MaxBackupIndex" value="5"/> 
    <param name="BufferedIO" value="false"/> 
    <param name="ImmediateFlush" value="true"/> 
    <param name="Append" value="true"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d, %-5p, %X{ORG_NAME}, %X{USER_NAME}, %c - %m%n"/> 
     <!-- Use pattern below if it is required to view the log files --> 
     <!-- using LogFactor5--> 
     <!--<param name="ConversionPattern" value="[slf5s.start] %d[slf5s.DATE] 
      %-5p[slf5s.PRIORITY] %X{ORG_NAME} %X{USER_NAME} 
      [slf5s.NDC] %c[slf5s.CATEGORY] - %m[slf5s.MESSAGE] %n"--> 
    </layout> 
</appender> 

Наконец, я добавил эти регистраторы как раз перед корневым элементом:

<logger name="org.hibernate" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.type" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.tool.hbm2ddl" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.pretty" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.cache" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.transaction" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.jdbc" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.hql.ast.AST" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.secure" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 
<logger name="org.hibernate.SQL" additivity="false"> 
    <level value="ALL"/> 
    <appender-ref ref="JDBCExceptionReporter"/> 
</logger> 

Эта конфигурация не работает и два строки всегда регистрируются в SystemOut.log, а не в моем JDBCExceptionReporter.log. У кого-нибудь есть ответ на мою проблему? Благодарю вас за помощь.

+0

Вы используете jboss? или какой-либо другой сервер приложений? расскажите нам больше об окружающей среде ... – mericano1

+0

Мы используем сервер приложений Websphere 6 на сервере AIX. Hibernate 3 и log4j-1.2.15, slf4j-log4j12-1.5.5 – astrotouf

ответ

1

Hibernate не использует Log4J напрямую. Вот почему ваши сообщения попадают в файл WebSphere SystemOut.log.

До версии 3.2, спящий режим используется Jakarta Commons Регистрация в качестве лесозаготовительного фасада. Начиная с версии 3.3 и выше, он переключился на SLF4J (Simple Logging Facade для Java). Поскольку Jakarta commons logging (JCL), SLF4J - это просто фасад, который часто связывается с другими форматами журналов, такими как Java Logging или, в данном случае, Log4J.

Я понимаю, что ваше приложение уже использует Log4J. Я также предполагаю, что вы используете Hibernate 3.3 или более новую версию.

Первое, что нужно добавить поддержку SLF4J для вашего проекта. Вы делаете это путем добавления этих зависимостей (с Ivy, Maven или же вы хотите):

SLF4J-api.jar (ядро SLF4J пакеты)

SLF4J-log4j12.jar (Становится персональным SLF4J к Log4J)

Таким образом, когда Hibernate регистрирует какое-либо сообщение, SLF4J захватит его и направит в Log4J.

Теперь, когда дело доходит до вашего собственного кода приложения, у вас есть два подхода.

1: Держите ваши классы непосредственно взаимодействующие с классами LOG4J (а именно Logger и LoggerFactory)

Таким образом, вы держите ваши классы непосредственно ссылающихся Log4J Logger, как это:

Logger logger = Logger.getLogger("com.foo"); // from package org.apache.log4j 

Так, короче , Hibernate будет использовать SLF4J -> Log4J, и вы будете использовать напрямую Log4J

2: Второй подход заключается в том, чтобы ваш код использовал SLF4J. Это не очень большие изменения, как вы, возможно, придется изменить только одну строку кода в каждом из классов, которые производит журнальные сообщения:

Logger logger = LoggerFactory.getLogger("com.foo"); // from package org.slf4j 

Если вы используете старую версию Hibernate (3,2 или старше), вам придется обмануть его, чтобы не использовать Jakarta Commons Logging.Во-первых, вам придется очистить файлы JAR, записывающие JAR-файлы из ваших зависимостей (вручную или с исключением, если вы используете какой-либо менеджер зависимостей). Тогда вам придется добавить SLF4J порт Общин нометрии к вашему пути к классам:.

добавить JCL-над-SLF4J-xyzjar (хуга является его версией я использую JCL-над-SLF4J-1.6. 1.jar, например).

Эта банка имеет точные классы и пакеты старого сообщества commging-logging.jar, тем самым эффективно обходя все зависимые от сообщества приложения для регистрации на SLF4J.

Смежные вопросы