kotlin - 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"
}
}
在正常情况下,当一切正常时,主体中的日志记录interceptCall
和onMessage
方法都会被触发。但是,在意外情况下,例如 gRPC 服务器与之通信的数据库已关闭,onMessage
方法中的日志记录不会被触发。
现在,您可以看到我只能访问onMessage
方法内的请求负载(或消息)。在此之前如何访问请求有效负载,即在interceptCall
?
我检查过的 StackOverflow 问题不能解决我的问题:
解决方案
推荐阅读
- git - IntelliJ:为什么在我运行 Kotlin 文件时会创建这些文件以及如何忽略它们?
- pandas - 无损训练集,准确率低
- cmake - 控制传递给生成器的标志
- javascript - nodejs中文件夹的哈希
- c# - 重复键值违反唯一约束 EF 核心
- arrays - C - 当我尝试将结构从数组复制到结构中包含的数组时出现问题
- c# - SignalR C# 客户端错误:FormatException:已识别项目之一的格式无效
- google-apps-script - 我有一个谷歌脚本,它从谷歌表单中提取信息并将其存储到工作表中。直到上周它都运行良好,但功能失败了
- jquery - 将nodejs函数传递给pupeteer中的page.$$eval
- javascript - 使用 JQuery 自动完成多选