首页 > 解决方案 > gRPC Java - 服务器收到请求后立即记录请求有效负载

问题描述

我的目标是在服务器收到 gRPC 请求有效负载后立即记录它,然后再执行其他任何操作。

这就是我编写ServerInterceptor实现以尝试记录请求有效负载的方式。

import io.grpc.ForwardingServerCallListener
import io.grpc.Metadata
import io.grpc.ServerCall
import io.grpc.ServerCallHandler
import io.grpc.ServerInterceptor

class RequestLoggingInterceptor(private val shouldLogRequest: Boolean) : ServerInterceptor {
    override fun <ReqT : Any, RespT : Any> interceptCall(
        call: ServerCall<ReqT, RespT>,
        headers: Metadata,
        next: ServerCallHandler<ReqT, RespT>
    ): ServerCall.Listener<ReqT> {
        if (!shouldLogRequest) {
            return next.startCall(call, headers)
        }

        val logBuilder = logger.info()
            .event(EVENT)
            .add("method", call.methodDescriptor.fullMethodName)

        logBuilder.log("before forwarding")

        return object : ForwardingServerCallListener.SimpleForwardingServerCallListener<ReqT>(next.startCall(call, headers)) {
            override fun onMessage(message: ReqT) {
                logBuilder
                    .add("request", message.toString())
                    .log("after forwarding")
                super.onMessage(message)
            }
        }
    }

    companion object {
        private val logger by LoggerCreator
        private const val EVENT = "grpc_request_logging"
    }
}

在正常情况下,当一切正常时,主体中的日志记录interceptCallonMessage方法都会被触发。但是,在意外情况下,例如 gRPC 服务器与之通信的数据库已关闭,onMessage方法中的日志记录不会被触发。

现在,您可以看到我只能访问onMessage方法内的请求负载(或消息)。在此之前如何访问请求有效负载,即在interceptCall?

我检查过的 StackOverflow 问题不能解决我的问题:

标签: kotlinlogginggrpcgrpc-javaarmeria

解决方案


推荐阅读