
在 GraphQL Yoga 中,可通过 useLogger 插件监听执行阶段错误事件,精准获取操作名、错误详情及上下文信息,实现与 Apollo Server didEncounterError 相同的可观测性能力。
在 graphql yoga 中,可通过 `uselogger` 插件监听执行阶段错误事件,精准获取操作名、错误详情及上下文信息,实现与 apollo server `didencountererror` 相同的可观测性能力。
GraphQL Yoga 作为轻量、现代且兼容性优异的 GraphQL 服务器运行时,虽未直接提供名为 didEncounterError 的生命周期钩子,但其插件系统(尤其是 useLogger)提供了功能对等、语义清晰且更灵活的错误捕获机制。
useLogger 是 Yoga 内置的核心可观测性插件,它会在请求生命周期的关键节点(如 executeStart、executeEnd、willSendResponse 等)触发日志事件。其中,executeEnd 事件天然携带完整的执行结果(含 errors 数组)和上下文快照,是替代 didEncounterError 的首选方案。
以下为标准用法示例:
import { createYoga, useLogger } from 'graphql-yoga';
const yoga = createYoga({
schema,
plugins: [
useLogger({
logFn: (eventName, args) => {
// 仅在执行完成且存在错误时处理
if (eventName === 'executeEnd' && args.result?.errors?.length > 0) {
console.log('Operation Name:', args.operationName || 'anonymous');
console.log('Errors:', args.result.errors);
console.log('Context (partial):', {
// 注意:args.context 是执行上下文的浅拷贝,可用于读取(如 req, user, db 等)
hasUser: !!args.context?.user,
requestID: args.context?.requestId,
});
}
},
}),
],
});✅ 关键特性说明:
- args.result.errors 包含所有 GraphQL 执行期抛出的 GraphQLError 实例(含原始 originalError);
- args.operationName 提供当前请求的操作名称(如 "GetUser"),便于日志聚合与追踪;
- args.context 是执行上下文对象(即 context 函数返回值),可安全读取(如认证用户、数据库连接、请求元数据等),但不可修改;
- eventName 支持精细化控制,避免无谓日志(例如仅响应发送前检查:eventName === 'willSendResponse')。
⚠️ 注意事项:
- useLogger 默认记录所有事件;生产环境建议过滤 eventName 并限制日志级别,避免性能损耗;
- 若需访问原始 HTTP 请求对象(如 req.headers),请确保 context 工厂函数已将其注入(例如 context: ({ req }) => ({ req }));
- 错误堆栈默认被 GraphQL 屏蔽(extensions.exception 仅在开发环境暴露);如需完整异常信息,请配合 maskedErrors: false(仅限开发)或自定义 formatError;
- 不要在此处执行阻塞 I/O(如写文件、调用外部 API),否则会拖慢整个请求链路;高阶需求建议将错误转发至 Sentry、Datadog 等专用监控服务。
总结而言,useLogger 不仅复现了 Apollo Server 的错误钩子能力,还通过结构化事件模型提供了更强的可扩展性。迁移时只需替换插件配置、调整事件判断逻辑,即可无缝升级错误可观测体系。








