gpt4 book ai didi

java - 从 MDC 中清除 requestId 的位置

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:22 31 4
gpt4 key购买 nike

我正在尝试将 requestId 添加到我的网络应用程序的日志中,如图所示 here .

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();
}
}

问题是它在上面的过滤器中从 MDC 设置和删除 requestId。我还记录了我的应用程序使用 WriterInterceptor 生成的响应主体。问题是,因为 interceptors run after filters ,当我的WriterInterceptor执行时,MDC中没有requestId。

我的问题是,在 WriterInterceptor 的末尾调用 MDC.clear() 是否可以(这感觉有点怪异),或者是否有更好的方法实现这个目标?

最佳答案

我遇到了同样的问题。这就是它目前在我正在开发的代码中的工作方式

@Order(Ordered.HIGHEST_PRECEDENCE)
public final class RequestFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
//stuff
chain.doFilter(request, response);
} finally {
// this clears a specific entry from the MDC but not the entire MDC
RequestContext.clear();
}
}
}

可以在这里的 finally block 中清除整个 MDC...但我不知道 Spring 何时记录异常。我会不会清仓太早了?我的新计划是在开始请求时清除 MDC。

我不确定这是否是一个完整的答案,但在我的最高优先级过滤器中清除 MDC 应该可行。

关于java - 从 MDC 中清除 requestId 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36058317/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com