2014-09-08 2 views
1

서블릿 컨텍스트 리스너를 사용하여 호스트 이름을 MDC 변수로 설정하려고합니다. MDC 변수는 리스너 자체에서만 사용할 수 있지만 다른 서블릿에서 로그를 작성하면 사라집니다. 여기Log4j2 : 서블릿 컨텍스트 리스너를 사용하여 MDC 키를 설정할 수 없습니다.

내 리스너 코드 :

여기
public class MdcServletListener implements ServletContextListener { 

    /** logger. */ 
    private static Logger logger = LoggerFactory 
      .getLogger(MdcServletListener.class); 

    /* 
    * (non-Javadoc) 
    * 
    * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet. 
    * ServletContextEvent) 
    */ 
    @Override 
    public void contextDestroyed(ServletContextEvent sContext) { 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see 
    * javax.servlet.ServletContextListener#contextInitialized(javax.servlet 
    * .ServletContextEvent) 
    */ 
    @Override 
    public void contextInitialized(ServletContextEvent sContext) { 
     try { 
      ThreadContext.put("LISTENER", "TEST"); 
      logger.info("Inizializzazione variabili mdc completata"); 
     } catch (Exception e) { 
      logger.error("Inizializzazione variabili mdc fallita", e); 
     } 

    } 

} 

내 web.xml의 :

<listener> 
     <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>MdcServletListener</listener-class> 
    </listener> 
    <filter> 
     <filter-name>log4jServletFilter</filter-name> 
     <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class> 
    </filter> 
    <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> 

어떤 제안? 감사합니다. .

답변

2

MDC 구성은 클라이언트 특정 또는 요청 특정 데이터를 보유하며 기본적으로 스레드/클라이언트별로 수행됩니다. 즉, 서블릿에 대한 각 클라이언트 요청은 컨테이너에 의해 별도의 스레드에 의해 처리되므로, 구성은 ServletContextListener (Your MdcServletListener 클래스)보다는 해당 서블릿에 대한 필터로 들어가야합니다. 확장 한 ServletContextListener는 웹 애플리케이션 당 MDC가 의도 한 개별 요청 데이터를 보유하지 않습니다.

ThreadContext.put("LISTENER", "TEST"); 자신의 서블릿 필터에이 줄을 사용하시는 것이 좋습니다.

그리고 나서 log4j.properties에서; 위의 변수를 사용하여 설정할 수 있습니다 : %X{LISTENER}%n.

예를 들어 당신의 log4j.properties에서 펜더의 구성은 다음과 같이 변경됩니다 : - log4j.appender.yourAppender.layout.ConversionPattern = %-4r [%t] %5p %c %x - %m - %X{LISTENER}%n

를 위의 예제의 설정 통지 설정 한 MDC 특정 데이터에 액세스 할 결국 추가 %X{LISTENER}%n에서.