推荐的登录方式 阿波罗服务器.



Apollo服务器似乎没有附带任何类型的日志记录。这使得它很难按原样在生产环境中使用 - 它实际上是盲目的。是否有任何推荐的方法来启用不同类型的日志?

我专门查看详细日志,错误日志(当服务器崩溃/内部组件崩溃时(和其他调试日志。

更新: 我已经在使用winston来记录基本事件。此问题与详细日志记录有关 - 例如记录请求生命周期的各个部分、服务器崩溃、缓存错误等。

目前只有实验性 API 用于更精确的日志记录。 https://www.apollographql.com/docs/apollo-server/features/metrics/#granular-logs

const { ApolloServer }  = require('apollo-server');
const LoggingExtension = require('./logging');
const server = new ApolloServer({
typeDefs,
resolvers,
extensions: [() => new LoggingExtension()]
});
server.listen().then(({ url }) => {
console.log(`🚀  Server ready at ${url}`);
});

在阿波罗官方GitHub上查看logging文件示例: https://github.com/apollographql/apollo-server/blob/8914b135df9840051fe81cc9224b444cfc5b61ab/packages/apollo-server-core/src/logging.ts

我建议创建一个日志记录扩展并在以下之一中使用:

  • https://www.npmjs.com/package/winston
  • https://www.npmjs.com/package/bunyan

您将能够根据需要管理日志。

  • 按环境打开/关闭(生产/开发/暂存/等(
  • 将日志管道传输到文件或标准输出/标准删除器或其他
  • 具有日志"级别"节点的控制台仅记录到标准输出/标准输出

查看这篇文章: https://www.coreycleary.me/should-you-use-a-logging-framework-or-console-log-in-node/

附言虽然这是一个实验性 API,但它可能会被更改。虽然它已经被记录了一些,但可能不会发生重大变化,但你永远不知道。我不建议投入太多资源使用它的ATM。

请参阅Apollo Log扩展 这是 GraphQL 日志记录的一个选项。我观察到的问题是,当我们将其与阿波罗网关一起使用时,它不起作用。

阿波罗日志

https://github.com/shellscape/apollo-log

用于在阿波罗服务器中登录 您可以通过定义自定义插件在阿波罗服务器中设置细粒度的操作日志记录。Apollo Server 插件使您能够执行操作以响应 GraphQL 请求生命周期的各个阶段,例如每当从客户端收到 GraphQL 请求时。 下面是示例。您只需要添加日志库而不是控制台.log即可从 Apollo 服务器的生命周期中获取完整的日志。

const myPlugin = {
// Fires whenever a GraphQL request is received from a client.
async requestDidStart(requestContext) {
console.log('Request started!)

return {
// Fires whenever Apollo Server will parse a GraphQL
// request to create its associated document AST.
async parsingDidStart(requestContext) {
console.log('Parsing started!');
},
// Fires whenever Apollo Server will validate a
// request's document AST against your GraphQL schema.
async validationDidStart(requestContext) {
console.log('Validation started!');
},
}
},
};
const server = new ApolloServer({
typeDefs,
resolvers,
plugins: [
myPlugin
]
});

Apollo GraphQL 插件可以提供日志记录功能。它还可以为响应事件提供支持。这是这样做的理想方法。

参考 - https://www.apollographql.com/docs/apollo-server/integrations/plugins/

实现示例

/* Defining the Apollo Server */
const apollo = new ApolloServer({
playground: process.env.NODE_ENV !== 'production',
schema: gqlSchema
subscriptions: {
path: '/subscriptions',
},
plugins: [
{
requestDidStart: ( requestContext ) => {
if ( requestContext.request.http?.headers.has( 'x-apollo-tracing' ) ) {
return;
}
const query = requestContext.request.query?.replace( /s+/g, ' ' ).trim();
const variables = JSON.stringify( requestContext.request.variables );
console.log( new Date().toISOString(), `- [Request Started] { query: ${ query }, variables: ${ variables }, operationName: ${ requestContext.request.operationName } }` );
return;
},
},
]
});

最新更新