gpt4 book ai didi

java - 设置 MDC 以使用 ServerInterceptor 登录 grpc-java 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 04:58:47 28 4
gpt4 key购买 nike

我想使用 log4j2 中的 ThreadContext 来设置 MDC 上下文键,例如 request-iduser-id 来跟踪日志中的请求信息以进行调试。

我编写了一个 MdcInterceptor ,它执行以下操作:

public class MdcInterceptor implements ServerInterceptor {

@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
ServerCallHandler<ReqT, RespT> next) {
ThreadContext.put("rid", generateId());
return next.startCall(call, headers);
}
}

不幸的是,它不起作用,因为似乎可以从具有不同 ThreadContext 的服务器执行器的不同线程调用不同的回调。

我在这里找到了一些解决方案 https://github.com/grpc/grpc-java/issues/1949#issuecomment-226884288这表示应该在 SimpleForwardingServerCallListener 中的每个回调中设置 ThreadContext

事实是,在我的情况下,如果可能的话,应该在 MdcInterceptor 之后调用的不同 UserInfoInterceptor 中添加一些附加信息(一些需要 token 验证和的身份验证用户信息) ETC。)。我应该如何将此信息正确添加到请求范围的 ThreadContext 中?

发布的解决方案是唯一可能的变体吗?我在 SimpleForwardingServerCallListener 中的每个 super 调用周围放置了 try-finally block ,这看起来有点奇怪,更不用说我应该在每个回调中而不是一次设置上下文。

最佳答案

您可以使用io.grpc.Context ,它处理将 RPC 特定信息传播到您的回调中。在调用 ClientCall.Listener(和 StreamObserver)上的任何事件之前,gRPC 库将安装正确的上下文。 Ray Tsang 做了一个good example如何使用 API。

关于java - 设置 MDC 以使用 ServerInterceptor 登录 grpc-java 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56396647/

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