node.js - 在 node.js 中通过 ID 跟踪请求流

标签 node.js asynchronous logging promise mdc

在我的 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/

相关文章:

javascript - Brain.js - 无法从 json 文件加载网络

node.js - 无法从node.js中的req.body获取值

go - 如何打印原始日志以使用 Go 流畅而不是使用 json 映射

javascript - 从 http 内部函数返回数据

tomcat - 日志记录不适用于 tomcat 8 中的 Grails 应用程序

parsing - 用于解析 SMTP 日志以查找退回邮件的工具

javascript - 执行文件太多次?

javascript - moment.js timezone 获取毫秒

javascript - 等待异步队列进行(异步模块)

python - 与 urllib2 或其他 http 库的多个(异步)连接?