我想在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]...
[正如您所见,在traceId
日志行中缺少UsersService
,因为我不知道如何使用基于请求的记录器合理地处理全垂直不使用Scope.REQUEST注入范围 。由于性能原因,我将尽量避免将所有提供程序级联到REQUEST
范围。
并且我设法通过截获传入请求,为它分配一个traceId,使用traceId实例化记录器并将其附加到请求来达到这一目标。然后,在控制器中,我注入了一个自定义参数装饰器(具有控制器类名称,因此它拾取了记录器上下文的第一部分)。
而且由于NodeJS的特性,我相信这是我所能得到的。我来自Java世界,我们可以使用线程及其局部变量或不同的基于线程的解决方案来处理这些问题。在这个生态系统中,最好的解决方案是什么?
用例是生产级日志记录系统,它能够基于唯一的请求标识符来关联来自代码不同部分的日志。
编辑:前段时间,我在NodeJS中看到了Async Hooks。在这次调查中,我忘了朝那个方向走。但是快速浏览,它们仍然是[[experimental功能。对基于它们的解决方案有何评论?
LoggerService
时也具有请求上下文,它在async_hooks
(cls-hooked)之上,而不使用Scope.REQUEST
。] >[前一段时间,我在NodeJS中看到了Async Hooks。在这次调查中,我忘了朝那个方向走。但是快速浏览,它们仍然是实验功能。对基于它们的解决方案有何评论?[cls-hooked每周的安装量超过200,000,并且我正在生产中使用nestjs-pino(使用nodejs 12,并且到目前为止没有任何问题。