mar*_*icn 4 logging typescript nestjs
我想在 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]...
Run Code Online (Sandbox Code Playgroud)
在这里,如您所见,我traceId在UsersService日志行中丢失了,因为我不知道如何在不使用 Scope.REQUEST 注入范围的情况下使用基于请求的记录器来合理地处理完全垂直。REQUEST出于性能原因,我会尽量避免将所有提供程序级联到范围内。
我设法通过拦截传入的请求,为其分配一个 traceId,使用 traceId 实例化一个记录器并将其附加到请求中来做到这一点。然后在控制器中,我注入一个自定义参数装饰器(使用控制器类名,以便它获取记录器上下文的第一部分)。
由于 NodeJS 的性质,我相信这是我所能做到的。我来自 Java 世界,在那里我们可以使用线程及其局部变量或不同的基于线程的解决方案来处理这些东西。在这个生态系统中,最好的解决方案是什么?
用例是生产级日志系统,它能够根据唯一的请求标识符关联来自代码不同部分的日志。
编辑:前段时间我在 NodeJS 中看到了 Async Hooks。在这次调查中,我忘了往那个方向走。但是快速浏览一下,它们仍然是实验性功能。对基于它们的解决方案有何评论?
您可以尝试nestjs-pino,它使用标头记录每个响应,并且在将其用作 时还具有请求上下文LoggerService,它在async_hooks(cls-hooked)之上工作而不使用Scope.REQUEST.
前段时间我在 NodeJS 中看到了 Async Hooks。在这次调查中,我忘了往那个方向走。但是快速浏览一下,它们仍然是实验性功能。对基于它们的解决方案有何评论?
cls-hooked每周安装超过 200,000 次,我在生产中使用nestjs-pino(使用 nodejs 12),到目前为止没有任何问题。
| 归档时间: |
|
| 查看次数: |
3741 次 |
| 最近记录: |