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::interceptCallQGrpcClientInterceptor::interceptServerStream。每个方法处理特定类型的 Qt GRPC 交互:单一调用和服务器流,分别。因为 QGrpcChannelOperation 将参数存储在序列化形式中,所以两种方法都需要反序列化请求,然后可以使用 qDebug() 进行日志记录。

使用 QObject::connect 订阅 QGrpcCallReply::finishedQGrpcServerStream::messageReceived 信号,并记录响应。

注册日志拦截器

接下来,您需要将日志拦截器注册到 QGrpcClientInterceptorManager。这确保它成为拦截链的一部分。

QGrpcClientInterceptorManager manager;
std::shared_ptr<LoggingInterceptor> loggingInterceptor = std::make_shared<LoggingInterceptor>();
manager.registerInterceptor(loggingInterceptor);

© 2024 Qt 公司。此处包含的文档贡献者是各自版权的拥有者。此处提供的文档受 GNU 自由文档许可证版本 1.3 条款的约束,由自由软件基金会发布。Qt 和相应的标志是芬兰和/或其他国家的 Qt 公司的商标。所有其他商标均为其各自拥有者的财产。