【发布时间】: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