簡體   English   中英

使用ServerInterceptor設置MDC以登錄grpc-java的正確方法是什么?

[英]What is the proper way to set MDC for logging in grpc-java with ServerInterceptor?

我想使用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添加一些額外的信息(一些需要令牌驗證等的auth用戶信息)。 我應該如何正確地將此信息添加到請求范圍的ThreadContext

發布的解決方案是唯一可能的變體嗎? 我在SimpleForwardingServerCallListener為每個超級調用設置了try-finally塊,這一點看起來有點奇怪,更不用說我應該在每個回調中設置上下文不是一次。

您可以使用io.grpc.Context ,它處理RPC特定信息到回調中的傳播。 在調用ClientCall.Listener (和StreamObserver )上的任何事件之前,gRPC庫將安裝正確的上下文。 Ray Tsang就如何使用API​​做了一個很好的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM