QGrpcClientInterceptor 日志记录示例
日志拦截器
日志拦截器可以是一个灵活的工具,用于深入了解您的 Qt GRPC 请求。通过创建一个自定义拦截器,您可以定制日志行为以满足应用程序的具体要求。
创建日志拦截器
要创建日志拦截器,您需要继承 QGrpcClientInterceptor 并覆盖适当的拦截方法(s)以集成日志功能。
先决条件
为了确定我们可以处理哪些类型的拦截器,让我们假设我们的 .proto 文件是
syntax = "proto3"; message SimpleStringMessage { string testFieldString = 6; } service TestService { rpc testMethod(SimpleStringMessage) returns (SimpleStringMessage) {} rpc testMethodServerStream(SimpleStringMessage) returns (stream SimpleStringMessage) {} }
LoggingInterceptor 实现方式
以下是一个简单的 LoggingInterceptor 示例
class LoggingInterceptor : public QGrpcClientInterceptor { protected: void interceptCall(std::shared_ptr<QGrpcChannelOperation> operation, std::shared_ptr<QGrpcCallReply> response, QGrpcInterceptorContinuation<QGrpcCallReply> &continuation) override { // Log an outgoing requests here SimpleStringMessage requestArg; if (!operation->serializer()->deserialize(&requestArg, operation->arg())) { qError() << "Deserialization of arg failed."; return; } qDebug() << "Request sent:" << requestArg.testFieldString(); continuation(std::move(response), operation); // Intercept the response auto responsePtr = response.get(); QObject::connect(responsePtr, &QGrpcServerStream::messageReceived, responsePtr, [responsePtr]{ SimpleStringMessage mess = responsePtr->read<SimpleStringMessage>(); qDebug() << "Response received:" << mess.testFieldString(); }); } void interceptServerStream(std::shared_ptr<QGrpcChannelOperation> operation, std::shared_ptr<QGrpcServerStream> stream, QGrpcInterceptorContinuation<QGrpcServerStream> &continuation) override { // Intercept the response QObject::connect(stream.get(), &QGrpcServerStream::messageReceived, this, [stream] { SimpleStringMessage mess = stream->read<SimpleStringMessage>(); qDebug() << "Response received:" << mess.testFieldString(); }); // Log incoming and outgoing requests here SimpleStringMessage requestArg; if (!operation->serializer()->deserialize(&requestArg, operation->arg())) { qError() << "Deserialization of arg failed."; return; } qDebug() << "Request sent:" << requestArg.testFieldString(); continuation(std::move(response), operation); } };
LoggingInterceptor 覆盖了两个拦截方法:QGrpcClientInterceptor::interceptCall 和 QGrpcClientInterceptor::interceptServerStream。每个方法处理特定类型的 Qt GRPC 交互:单一调用和服务器流,分别。因为 QGrpcChannelOperation 将参数存储在序列化形式中,所以两种方法都需要反序列化请求,然后可以使用 qDebug()
进行日志记录。
使用 QObject::connect 订阅 QGrpcCallReply::finished 或 QGrpcServerStream::messageReceived 信号,并记录响应。
注册日志拦截器
接下来,您需要将日志拦截器注册到 QGrpcClientInterceptorManager。这确保它成为拦截链的一部分。
QGrpcClientInterceptorManager manager; std::shared_ptr<LoggingInterceptor> loggingInterceptor = std::make_shared<LoggingInterceptor>(); manager.registerInterceptor(loggingInterceptor);
© 2024 Qt 公司。此处包含的文档贡献者是各自版权的拥有者。此处提供的文档受 GNU 自由文档许可证版本 1.3 条款的约束,由自由软件基金会发布。Qt 和相应的标志是芬兰和/或其他国家的 Qt 公司的商标。所有其他商标均为其各自拥有者的财产。