node.js表达请求ID

gib*_*son 11 node.js express

我正在尝试为记录目的创建某种请求ID,这将通过请求流中的每个函数提供给我.我想记录请求流的每一步,并用Id说明哪个日志行是针对哪个请求的.

我查看了一些想法,并提出了两个主要建议:

第一个是创建一个中间件,它将在'req'对象中添加一个字段,如下所示(如此处所示):

var logIdIterator = 0;

app.all('*', function(req, res, next) {
  req.log = {
    id: ++logIdIterator
  }
  return next();
});
Run Code Online (Sandbox Code Playgroud)

第二个是使用continuation-local-storage

问题是:

对于第一种方法 - 这意味着我将不得不为流中的每个函数传递一个额外的参数,这对于使用无数API和流程的成熟应用程序来说并不是一个简单的解决方案.

第二个看起来很有希望但不幸的是它有一些国家迷失的问题(见这里例如).此外,当我们使用我们的redis库时,它发生了几次 - 这很糟糕,因为redis请求发生在我们的每个流上.

我想如果我找不到另一个解决方案,我将不得不使用第一种方法,只是我想避免将额外的参数传递给数千个现有函数.

我的问题是 - 您如何建议通过请求流维护请求ID?

Bob*_*ill 0

您可以通过 (a) 将信息存储为仅服务器 cookie 以及 (b) 将更多信息放入 cookie 中,而不仅仅是计数器,从而使您的原始例程变得更加复杂。例如,我使用以下内容作为对我的应用程序的所有调用的跟踪:

console.log('['+count+'] at: '+format.asString('hh:mm:ss.SSS', new Date())+' Url is: ' + req.url);
Run Code Online (Sandbox Code Playgroud)

其中“count”从应用程序启动时递增(是的,最好使用持久单例)。这给了我对服务器(req.url)的每次调用以及调用的准确时间。如果您的应用程序正在进行会话级别管理,则可以轻松扩展以获取会话 ID。