【问题标题】:How to log stacktrace on NestJS + GraphQL?如何在 NestJS + GraphQL 上记录堆栈跟踪?
【发布时间】:2022-11-13 11:48:43
【问题描述】:

我在下面使用 Apollo 试用 NestJS + GraphQL。当我将 Apollo“调试”选项设置为 true 时,我可以在响应中看到堆栈跟踪,但我找不到在我们的应用程序日志中记录此堆栈跟踪的方法。

我想将它放在日志中以解决生产中的问题。有没有办法做到这一点?

【问题讨论】:

    标签: nestjs apollo-server


    【解决方案1】:

    我能够使用 ApolloServerPlugin 做到这一点。

    【讨论】:

    • 你是怎么做到的 ?
    • @KevinGilbert 我把我的 ApolloServerPlugin 放在另一个答案中
    【解决方案2】:

    这是我使用的 ApolloServerPlugin

    import { Plugin } from '@nestjs/apollo';
    import { Logger } from '@nestjs/common';
    import {
      ApolloServerPlugin,
      GraphQLRequestListener,
    } from 'apollo-server-plugin-base';
    import {
      BaseContext,
      GraphQLRequestContext,
      GraphQLRequestContextWillSendResponse,
    } from 'apollo-server-types';
    import * as util from 'util';
    
    @Plugin()
    export class LoggingPlugin implements ApolloServerPlugin {
      constructor(private readonly logger: Logger) {}
    
      async requestDidStart(
        requestContext: GraphQLRequestContext,
      ): Promise<GraphQLRequestListener> {
        const thatLogger = this.logger;
        if (requestContext.request.operationName !== 'IntrospectionQuery') {
          thatLogger.log(
            `request query: ${requestContext.request.query || 'undefined'}`,
          );
        }
        return {
          async willSendResponse(
            requestContextWillSendResponse: GraphQLRequestContextWillSendResponse<BaseContext>,
          ): Promise<void> {
            if (
              requestContextWillSendResponse.request.operationName !==
              'IntrospectionQuery'
            ) {
              if (!requestContextWillSendResponse.errors) {
                thatLogger.log(`response without any errors`);
              } else {
                const errors = requestContextWillSendResponse.errors.concat();
                const responseErrors =
                  requestContextWillSendResponse.response.errors?.concat();
                if (errors && responseErrors) {
                  for (let i = 0; i < errors.length; i++) {
                    const result = {
                      ...responseErrors[i],
                      stack: errors[i].stack,
                    };
                    if (result.extensions) {
                      delete result.extensions.exception;
                    }
                    if (
                      result.extensions &&
                      result.extensions.code !== 'INTERNAL_SERVER_ERROR'
                    ) {
                      thatLogger.warn(
                        `response with errors: ${util.inspect(result, {
                          depth: 4,
                        })}`,
                      );
                    } else {
                      thatLogger.error(
                        `response with errors: ${util.inspect(result, {
                          depth: 4,
                        })}`,
                      );
                    }
                  }
                }
              }
            }
          },
        };
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2014-11-01
      • 1970-01-01
      • 2021-02-07
      • 2013-11-16
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多