在我的 node.js 应用程序中,每当我收到请求时,我都想用一些唯一的 ID“标记”它,并能够通过这个 ID 跟踪与此请求相关的所有事件(日志语句)。因此,当收到请求并将其处理传递给较低的应用程序层(服务、数据库调用等)时,我希望能够收集所有与给定请求 ID 匹配的日志,以重建其在应用程序中的旅程。
有了这张图片,我使用 request-local模块,但它做了一些让我失望的强大魔法(来自多个请求的日志获得相同的 ID)。
代码主要基于 Promises(不是普通的旧 Node 回调),我使用高阶函数来提供对我的实际函数的依赖(在启动期间构建应用程序树)。
第一个也是非常明显的解决方案是将此请求 ID 传递给每个调用的函数,但这是一场灾难,我不会这样做。
您如何(可靠地)进行这种请求跟踪,而不显式地将此 ID/上下文作为额外参数传递给所有级别的函数?
最佳答案
已编辑
这个库可以完成这项工作。它是 Winston 库的包装,所以它的配置方式相同,它为每个请求生成一个唯一的 ID,并在每个日志中打印它
https://github.com/davicente/express-logger-unique-req-id
===============
我采用了一种方法,其中 id 将根据请求是唯一的,并且您不需要在不同的调用和模块之间传递任何对象(req、id ...)。 它意味着使用一个库来创建唯一的 id,我选择了 node-uuid,另一个库在不同的模块(continuation-local-storage)之间共享上下文变量,但按请求使用命名空间,以便为所有调用(甚至是异步调用)。 此外,我包装了 Winston 库,以便在每个日志中打印请求 ID。有了它,您将能够跟踪一个请求的所有日志。
我在这里用代码示例写了一个完整的解释 https://solidgeargroup.com/express-logging-global-unique-request-identificator-nodejs
关于node.js - 在 node.js 中通过 ID 跟踪请求流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41379230/