2014-04-18 1 views
0

Tomcat 8.0.3 및 log4j 2.0-rc1을 사용하여 GWT 애플리케이션 (서블릿 2.5)을 배치했습니다.Log4j2가 로그 파일을 작성하지만 쓰지 않습니다.

나는 일반적인 로그 구성 오류를 수정했지만 콘솔이나 파일에는 아무 것도 기록되지 않는다고 생각합니다. 내 web.xml을

헤드 :

<listener> 
    <listener-class>org.apache.logging.log4j.core.web.Log4jServletContextListener</listener-class> 
</listener> 

<filter> 
    <filter-name>log4jServletFilter</filter-name> 
    <filter-class>org.apache.logging.log4j.core.web.Log4jServletFilter</filter-class> 
</filter> 

<context-param> 
    <param-name>log4jConfiguration</param-name> 
    <param-value>file:///C:/Users/name/Desktop/log4j2.xml</param-value> 
</context-param> 

<filter-mapping> 
    <filter-name>log4jServletFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
</filter-mapping> 

이것은 log4j2.xml 구성입니다 : 내가 추가

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="TRACE"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="[%p] %c{1}: %m%n"/> 
     </Console> 
     <File name="infoFile" fileName="${sys:catalina.home}/logs/info.log" > 
      <PatternLayout pattern="[%p] %c{1}: %m%n"/> 
     </File> 
    </Appenders> 

    <Loggers> 
     <Root level="info"> 
      <Appender-Ref ref="Console"/> 
      <Appender-Ref ref="infoFile"/> 
     </Root> 
    </Loggers> 
</Configuration> 

모두 내 메이븐 의존성에 log4j2 API와 코어와 나는 그들이 WEB-INF\classes\에서 폭발 한 것을 볼 수 있습니다. catalina.properties의 skipJar 목록에서도 제거했습니다.

전쟁이 배포되면 localhost 또는 catalina 로그에 오류나 경고가 표시되지 않습니다.

INFO ContextListener: contextInitialized() 
INFO SessionListener: contextInitialized() 
INFO Log4jServletContextListener ensuring that Log4j starts up properly. 
INFO Log4jServletFilter initialized. 

이상한 것은이 info.log 파일을 만들었지 만에 기록되지 않습니다이다 : 이것은 로컬 호스트의 로그입니다.
나는 로그가 콘솔에 표시되는 Hibernate를 사용하고 있는데, 이것이 문제가 될 수 있습니까?

마지막으로이 내가 로거를 사용하고 방법은 다음과 같습니다

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

private static final Logger LOG = LogManager.getLogger(MyClass.class.getName()); 

public void myMethod() { 
    LOG.info("Logging some message"); 
} 

답변

2
(내가 경로에 공백을 사용할 수 없다는 것 때문에 log4j2 설정 파일 내 바탕 화면에 일시적으로)

최대한 멀리 귀하의 구성을 볼 수 있습니다 모든 웹 애플 리케이션을위한 log4j2 manual page에 설명 된대로 설정되어 있습니다.

log4j2.xml 구성 파일을 클래스 경로 (WEB-INF/classes 아래)에 넣고 log4jConfiguration 컨텍스트 매개 변수 설정을 제거하는 것이 좋습니다. 그러나 info.log 파일이 생성되는 것을보고 있기 때문에 log4j2.xml 파일이 이미 올바르게 발견되어 클래스 패스에 배치하면 도움이되지 않을 수 있습니다. (비록 시도해 볼만한 가치가있다.)

두 가지 다른 이유 때문에 로그 파일에 아무 것도 나타나지 않는다. 로그 출력이 버퍼링되고 버퍼가 모든 이벤트에서 플러시되지 않는다. 그러나 FileAppender의 기본값은 immediateFlush = true입니다. 따라서 rc1에 새로운 버그가 도입되었습니다. 이것은 가능하지만 가능성은 없습니다 (현재 트렁크 소스가 올바르게 보입니다).

마지막으로, 위의 예에서 myMethod 로깅을 수행하는 메소드가 호출되지 않았습니까? 이 메서드가 호출되었는지 확인하는 방법이 있습니까?

+0

'WEB-INF/classes'에 넣고 context-param을 제거하면 실제로 Log4j 컨텍스트 설정이 제공되지 않습니다. 나는 immediateFlush를 true로 설정하여 시도했지만 아무것도 기록되지 않았습니다. myMethod는 실제로 데이터베이스에서 사용자를 검색하는 메서드이며 웹 응용 프로그램에서 올바르게 표시됩니다. 모든 경우에 웹 응용 프로그램을 중지하면 다음과 같이 표시됩니다. '[null]에 대한 LoggerContext 제거 중입니다. 정상입니까? – Aerus

+0

전개 된 전쟁을 조사한 후, 방금 변경 한 모든 내 .class 파일이 5 일이라는 것을 알았습니다. 그래서 메소드 *가 실제로 호출되었지만 5 일 된 버전에는 로깅이 없으므로 아무 것도 기록되지 않았습니다. MyClass.class를 수동으로 추가하고 webapp를 다시로드하면 로깅됩니다.이제 Maven 배포 프로세스를 수정하는 중 ... – Aerus