2015-01-15 8 views
1

내가 한 수 일반 필터에 스레드 안전한 방법에서의 log4j (SL4J) MDC 컨텍스트를 설정 (http://blog.trifork.com/2013/06/06/adding-user-info-to-log-entries-in-a-multi-user-app-using-mapped-diagnostic-context/에서 코드)의 log4j (SLF4J) MDC 컨텍스트 인터셉터

import org.slf4j.MDC; 
import javax.servlet.*; 
import java.io.IOException; 

public class MDCFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) 
      throws IOException, ServletException { 
     User user= (User) session.getAttribute("USerSession"); 
     MDC.put("userName", user.getUserName()); 
    try { 
     chain.doFilter(req, resp); 
    } finally { 
     MDC.remove("userName"); 
    } 
    } 

} 

수 있다는 것을 발견 Struts 2 인터셉터에서 동일한 접근 방식을 사용합니까? 내가 궁금해하는 것은 스레드 안전 문제입니다.

Struts 2 인터셉터와 서블릿 필터는 스레드로부터 안전하지 않으며 MDC 구현은 스레드로부터 안전합니다. 따라서 위의 코드가 필터에서 정상적으로 작동하면 이론적으로 인터셉터에서 작업 스레드 안전해야합니다.

모든 댓글?!

답변

1

인터셉터는 스레드로부터 안전하지 않으므로 스레드로부터 안전하게 보호해야합니다. 예를 들어 아래의 인터셉터는 스레드로부터 안전합니다.

public class LoggerInterceptor extends AbstractInterceptor { 
    @Override 
    public String intercept(ActionInvocation invocation) throws Exception { 
    HttpSession session = ServletActionContext.getRequest().getSession(); 
    User user= (User) session.getAttribute("USerSession"); 
    MDC.put("userName", user.getUserName()); 
    String result; 
    try { 
     result = invocation.invoke(); 
    } finally { 
     MDC.remove("userName"); 
    } 
    return result; 
    } 
}