2012-02-24 1 views
4

최대 절전 모드 로깅 구성에 약간의 문제가 있습니다. 우리 애플리케이션에서는 두 개의 스레드가 동시에 Database 테이블의 각 행에 잠금을 설정하려고합니다. 가끔씩 이러한 스레드 중 하나가 이미 잠긴 행을 잠그려고합니다. 이 오류는 다음과 같이 throw됩니다.내 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 구성 파일에서이 같은 새로운 펜더 생성 :

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

이 구성은 작동하지 않았다 두 : 마지막으로

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

을, 난 그냥 루트 요소 전에 해당 로거를 추가 행은 항상 SystemOut.log에 기록되고 my JDBCExceptionReporter.log에는 기록되지 않습니다. 누군가 내 문제에 대한 해답을 갖고 있습니까? 도움에 감사드립니다.

+0

jboss를 사용하고 있습니까? 또는 다른 응용 프로그램 서버입니까? 환경에 대해 더 자세히 알려주십시오. – mericano1

+0

AIX 서버에서 Websphere Application Server 6을 사용하고 있습니다. Hibernate 3 및 log4j-1.2.15, slf4j-log4j12-1.5.5 – astrotouf

답변

1

Hibernate는 Log4J를 직접 사용하지 않습니다. 이것이 메시지가 WebSphere SystemOut.log 파일에 들어가는 이유입니다.

최대 버전 3.2까지, 최대 절전 모드는 로깅 외관으로 자카르타 커먼즈 로깅을 사용했습니다. 버전 3.3 이상에서는 SLF4J (Java 용 Simple Logging Facade)로 전환되었습니다. jakarta commons logging (JCL)처럼 SLF4J는 단지 외관 일 뿐이며 Java Logging이나 Log4J와 같은 다른 Logging Framework에 바인딩되는 경우가 많습니다.

귀하의 신청서가 이미 Log4J를 사용하고있는 것으로 알고 있습니다. 나는 또한 당신이 Hibernate 3.3 또는 최신 버전을 사용하고 있다고 가정하고있다.

가장 먼저해야 할 일은 SLF4J 지원을 프로젝트에 추가하는 것입니다. 이러한 종속성을 추가하여 (아이비, 메이븐 또는 그러나 당신이 원하는) 그렇게 : Log4J를에

SLF4J-api.jar을 (코어 SLF4J 패키지)

SLF4J-log4j12.jar (귀속의 SLF4J를)

이렇게하면, Hibernate가 어떤 메시지를 기록 할 때, SLF4J는 그것을 캡쳐하여 Log4J에 전달할 것이다.

이제 자신의 앱 코드를 생각해 보면 두 가지 접근 방식이 있습니다.

1 : 직접 Log4J를 클래스 (즉 로거 및 LoggerFactory)

이 방법으로 상호 작용하는 클래스를 유지, 직접 Log4J를 로거를 참조 수업은 다음과 같이 유지 :

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 

3.2 : 이것은 당신이 아마 로그 메시지를 생성하는 각 클래스에서 한 줄의 코드를 변경해야 겠지만, 그렇게 큰 변화가없는 또는 그 이상) 자카르타 커먼즈 로깅을 사용하지 않도록 속여 야합니다.먼저 종속성에서 commons-logging JAR 파일을 제거해야합니다 (종속성 관리자를 사용하는 경우 수동으로 또는 제외와 함께). 그런 다음 당신은 당신의 클래스 패스에 평민 로깅의 SLF4J 포트를 추가해야합니다 :.

이 버전 인 JCL - 이상 - SLF4J-xyzjar (XYZ를 추가 나는 JCL - 이상 - SLF4J-1.6을 사용합니다. 1.jar).

이 jar는 이전 commons-logging.jar의 정확한 클래스와 패키지를 가지고 있으므로 실제로 모든 commons-logging 종속 응용 프로그램을 사실상 SLF4J에 기록하도록 속입니다.