【发布时间】:2022-11-13 11:48:43
【问题描述】:
我在下面使用 Apollo 试用 NestJS + GraphQL。当我将 Apollo“调试”选项设置为 true 时,我可以在响应中看到堆栈跟踪,但我找不到在我们的应用程序日志中记录此堆栈跟踪的方法。
我想将它放在日志中以解决生产中的问题。有没有办法做到这一点?
【问题讨论】:
标签: nestjs apollo-server
我在下面使用 Apollo 试用 NestJS + GraphQL。当我将 Apollo“调试”选项设置为 true 时,我可以在响应中看到堆栈跟踪,但我找不到在我们的应用程序日志中记录此堆栈跟踪的方法。
我想将它放在日志中以解决生产中的问题。有没有办法做到这一点?
【问题讨论】:
标签: nestjs apollo-server
我能够使用 ApolloServerPlugin 做到这一点。
【讨论】:
这是我使用的 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,
})}`,
);
}
}
}
}
}
},
};
}
}
【讨论】: