2010-01-27 7 views
0

log4j를 사용하며 잘 작동합니다. log4j.xml 파일은 클래스 패스에 있습니다. appender와 category를 사용합니다. 다시 말해서, 내 코드 나 다른 librairy의 코드에는 문제가 없습니다.작동중인 log4j 구성은 Spring 클래스에서 무시됩니다.

하지만 스프링 클래스는 다른 곳에서 로그를 남기고 싶다는 메시지로 stdout을 계속 보냅니다. 짜증나게하기 시작했습니다.

오류 메시지 : org.springframework.jms : some error .... 보다 일반적으로 org.springframework 패키지의 모든 클래스는 stdout에 메시지를 보냅니다.

그래서 난 내의 log4j.xml에 넣고 :

<appender name="JMS-ERROR" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="tms.logs.folder/tms.logs.files.prefix-jms-error.log"/> 
    <param name="Append" value="true"/> 
    <param name="MaxFileSize" value="1000KB"/> 
    <param name="MaxBackupIndex" value="2"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="**DVIDEA** %d{dd.MM.yyyy HH:mm:ss} %c %m%n"/> 
    </layout> 
    <filter class="org.apache.log4j.varia.LevelRangeFilter"> 
     <param name="LevelMin" value="DEBUG" /> 
     <param name="LevelMax" value="FATAL" /> 
    </filter> 
</appender> 


<category name="org.springframework.jms" additivity="false"> 
    <appender-ref ref="JMS-ERROR"/> 
</category> 

그것은 다른 LIBRAIRIE와 작업입니다. 왜 봄?

저는 약간의 연구를하고 있습니다. Spring이 common-logging을 사용하고 log4j를 사용하지 않는다고 생각합니다. 가능한 원인인가요? 해결 방법은 없습니까?

내 web.xml에 log4jConfigurationListener를 추가하려고합니다. 그는 일하고 있지만 스프링 오류 메시지에 대한 통제권이 없습니다.

<context-param> 
    <param-name>log4jConfigLocation</param-name> 
    <param-value>classpath:log4j.xml</param-value> 
</context-param> 
<context-param> 
    <param-name>log4jRefreshInterval</param-name> 
    <param-value>10000</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 

편집 :

일부 추가 정보를 원하시면 :

  • 내가
  • log4j.property (기존의 log4j 설정) 톰캣 5.5 사용은 여전히 ​​역사적 이유가 존재한다. 내가 그것을 제거하려고 => 변화 없음.

편집 2 : 나는 다음과 같은 해결 방법을 사용하지만, 나는 그것으로 행복하지 않다 : 그것은 구성 할 수 없습니다입니다

java.util.logging.Logger springLogger = Logger.getLogger("org.springframework.jms"); 
springLogger.setLevel(Level.OFF); 
+0

당신이 사용하는 어떤 용기? WebSphere ??? – pgras

+0

tomcat, 질문을 편집했습니다. –

답변

0

당신이해야 할 수 있습니다

<bean id="log4jInitialization" 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
     <property name="targetClass" 
      value="org.springframework.util.Log4jConfigurer" /> 
     <property name="targetMethod" value="initLogging" /> 
     <property name="arguments"> 
      <list> 
       <value>conf/log4j.xml</value> 
      </list> 
     </property> 
    </bean> 
+0

beens가 잘 초기화되었지만 여전히 stdout에있는 org.springframework. *의 메시지가 있습니다. –

0

봄 아파치 코 몬즈를 사용 로깅은 차례로 STDOUT (java.util.logging 경유) 또는 Log4j 사용 여부를 결정합니다. STDOUT에서 Spring 출력을 얻는다면 commons-logging은 어떤 이유로 log4j를 찾지 못했습니다.

시스템 속성을 org.apache.commons.logging.diagnostics.dest으로 설정하면 commons-logging을 구성하여 log4j에서 결정할 단계가 무엇인지 알려주고 진단 로그를 기록 할 수 있습니다.

그래서 톰캣 시작 스크립트에서 시스템 속성을 설정하십시오.

-Dorg.apache.commons.logging.diagnostics.dest=STDOUT 
1

스프링 샘플에서는 slf4j를 사용하여 로그 메시지를 Commons Logging에서 log4j로 라우팅한다는 점에 유의하십시오. Maven의 pom.xml에서는이 방법 같습니다

<!-- Exclude Commons Logging --> 
<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>org.springframework.context</artifactId> 
    <version>${spring.version}</version> 
    <exclusions> 
     <!-- Exclude Commons Logging in favor of SLF4j --> 
     <exclusion> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>com.springsource.org.apache.commons.logging</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<!-- Add slf4j API --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>com.springsource.slf4j.api</artifactId> 
    <version>${slf4j.version}</version> 
</dependency> 

<!-- Add Commons Logging -> slf4j bridge --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId> 
    <version>${slf4j.version}</version> 
    <scope>runtime</scope> 
</dependency> 

<!-- Add slf4j -> log4j bridge --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>com.springsource.slf4j.log4j</artifactId> 
    <version>${slf4j.version}</version> 
    <scope>runtime</scope> 
</dependency> 
+0

실제로, slf4j가가는 길 같습니다. 그러나 일부 (짜증나는) un-controled 오류 메시지에 대한 로깅 프레임 워크를 변경하는 것은 나에게 과도한 것처럼 보입니다. 또는 log4j에서 slf4j로 전환하는 데 통증이 없습니까? (나는 이론적으로 그렇다고 확신하지만, 의심 스럽습니다.) –

+0

slf4j는 단지 외장이기 때문에 로깅 프레임 워크를 변경하면 안됩니다. 내가 게시 한 구성은 log4j로 코드에서 로깅을 사용하여 문제없이 작동합니다. – axtavt

+0

이것은 부분적으로 정확합니다. 당신은 아마도 나타날 수있는 다른 모든 장소에서 커먼즈 로깅을 제외해야합니다 (그리고 꽤있을 수 있습니다). 특정 이유가 없으면 com.springsource 아티팩트를 사용하지 않는 것이 좋습니다. 내 대답에 대한 자세한 내용을 참조하십시오. –

0

당신은 SLF4J를 사용하고, (log4j를) 원하는 로깅 플랫폼으로 다리를 포함해야합니다하지만 당신은 는 할 수있는 모든 다른 장소에서 평민 로깅을 제외해야 이를 수행하는 데 IDE를 사용하는 것이 좋으며, commons-logging을 위해 더미 항목을 넣을 수도 있습니다.그에 대한 자세한 내용은, 당신이해야 할 메이븐 중앙 올바른 방법을 사용하지만 경우 com.springsource 아티팩트를 사용하여 언급 SLF4J FAQ entry

이전의 답을 볼 수가 있습니다 :

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.7.10</version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.10</version> 
</dependency> 
관련 문제