我正在尝试将一个添加到我的网络应用程序的日志中,如此处requestId所示。
public class MDCFilter implements ContainerRequestFilter, ContainerResponseFilter
{
private static final String CLIENT_ID = "client-id";
@Context
protected HttpServletRequest r;
@Override
public void filter(ContainerRequestContext req) throws IOException
{
Optional<String> clientId = Optional.fromNullable(r.getHeader("X-Forwarded-For"));
MDC.put(CLIENT_ID, clientId.or(defaultClientId()));
}
@Override
public void filter(ContainerRequestContext req, ContainerResponseContext resp) throws IOException
{
MDC.remove(CLIENT_ID);
}
private String defaultClientId()
{
return "Direct:" + r.getRemoteAddr();
}
}
问题在于它在上述过滤器中设置和删除 requestId。MDC我还使用WriterInterceptor. 问题是,由于拦截器在过滤器之后运行,所以当我WriterInterceptor执行时,没有 requestId 在MDC.
MDC.clear()我的问题是,是否可以在结束时打电话WriterInterceptor(感觉有点骇人听闻),还是有更好的方法来实现这一点?