在并发系统中做上下文logging是否有一个简洁的方法?

我的具体例子是Node.js,但我认为在任何基于事件循环的系统中都存在同样的问题。

考虑以下简单的应用程序:

var logger = loggingmodule.Logger(); var server = http.createServer(function(req, res) { req.id = crypto.pseudoRandomBytes(10).toString('hex'); var log = logger.transaction(req.id); loadSomeAsyncData(log, function(err, data) { if (err) return bailout(err, req, res); doSomeAsyncAction(log, req.url, data.action, function(err, result) { if (err) return bailout(err, req, res); hydrateResultWithMoreAsyncData(log, data, result, onMoreData); function onMoreData(err, moreData) { if (err) return bailout(err, req, res); result.data = moreData; res.end(JSON.stringify({ data: data, result: result, })); } }); }); }); 
  • 日志logging模块有一个transaction方法,它返回一个上下文logging器,前缀所有行都有相同的标记
  • 为了关联在请求期间采取的任何行动,我们需要传递这个logging器
  • 这些行动还需要将logging器传递给他们的家属
  • 一切都需要以某种方式接受logging器的论据

问题:是否有将日志传递给每个函数的select?

我能想到的最接近的东西就像线程本地绑定 – 但是当然没有这样的抽象或者afaik可以存在Node.js