【问题标题】:NestJS log unique request traceNestJS 记录唯一请求跟踪
【发布时间】:2020-02-10 00:13:19
【问题描述】:

我想在 NestJS HTTP 服务中实现日志记录,这样每个传入的请求都会得到它的 traceId 并使用日志行进行记录。最好是这样的:

[LogInterceptor, traceId=b57847d0-ed31-11e9-969e-7dd13d8a9c1e] Before getUser at 1570911778049.
[UsersController, traceId=b57847d0-ed31-11e9-969e-7dd13d8a9c1e] Getting user...
[UsersService] Looking for user by id [testLocal]...

在这里,如您所见,我在 UsersService 日志行中缺少 traceId,因为我不知道如何在不使用 Scope.REQUEST 注入范围的情况下使用基于请求的记录器来合理处理完整垂直。出于性能原因,我会尽量避免将我的所有提供程序级联到 REQUEST 范围。

我设法通过拦截传入的请求、为其分配一个 traceId、使用 traceId 实例化一个记录器并将其附加到请求中来做到这一点。然后在控制器中,我注入了一个自定义参数装饰器(带有控制器类名,因此它会获取记录器上下文的第一部分)。

由于 NodeJS 的性质,我相信这是我能做到的。我来自 Java 世界,我们可以使用线程及其局部变量或不同的基于线程的解决方案来处理这些东西。在这个生态系统中,最好的解决方案是什么?

用例是生产级日志系统,它能够根据唯一的请求标识符关联来自代码不同部分的日志。

编辑:前段时间我在 NodeJS 中看到了 Async Hooks。在这次调查中,我忘了往那个方向走。但快速浏览一下,它们仍然是实验性功能。任何基于它们的解决方案的 cmets?

【问题讨论】:

    标签: typescript logging nestjs


    【解决方案1】:

    您可以尝试nestjs-pino,它记录每个带有标头的响应,并且在将其用作LoggerService 时还具有请求上下文,它在async_hooks (cls-hooked) 之上工作,而不是使用Scope.REQUEST

    前段时间我在 NodeJS 中看到了 Async Hooks。在这次调查中,我忘了往那个方向走。但快速浏览一下,它们仍然是实验性功能。任何基于它们的解决方案的 cmets?

    cls-hooked 每周安装超过 200,000 次,我在生产中使用nestjs-pino(使用 nodejs 12),到目前为止还没有任何问题。

    【讨论】:

    • 乍一看,似乎是个不错的选择。我将它集成到一个生产项目中,看起来不错。谢谢!
    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多