Struts 2 拦截器中的 Log4j (SLF4J) MDC 上下文
Log4j (SLF4J) MDC Context in Struts 2 Interceptor
我发现可以在通用过滤器中以线程安全方式设置 Log4j (SL4J) MDC 上下文(代码来自 Adding user info to log entries in a multi-user app using Mapped Diagnostic Context)
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 拦截器和 servlet 过滤器不是线程安全的,MDC
实现是线程安全的,所以如果上面的代码在过滤器中工作正常,理论上它必须是工作线程安全的拦截器。
有意见吗?!
拦截器不是线程安全的意味着你必须以线程安全的方式编写它们。例如下面的拦截器是线程安全的。
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;
}
}
我发现可以在通用过滤器中以线程安全方式设置 Log4j (SL4J) MDC 上下文(代码来自 Adding user info to log entries in a multi-user app using Mapped Diagnostic Context)
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 拦截器和 servlet 过滤器不是线程安全的,MDC
实现是线程安全的,所以如果上面的代码在过滤器中工作正常,理论上它必须是工作线程安全的拦截器。
有意见吗?!
拦截器不是线程安全的意味着你必须以线程安全的方式编写它们。例如下面的拦截器是线程安全的。
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;
}
}