[英]What is the proper way to set MDC for logging in grpc-java with ServerInterceptor?
我想使用log4j2中的ThreadContext來設置MDC上下文密鑰,如request-id
, user-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.