Node.js中的跨应用程序跟踪

时间:2017-09-23 14:04:32

标签: node.js

是否可以跟踪Node.js应用程序,就像通​​过分配请求ID并在日志输出中使用它来跟踪使用线程的应用程序一样?有第三方工具可以做到(NewRelic,Rollbar),但它们如何工作?如何实现类似的功能?我可以做这样的事情

function foo(x, logger) {
  logger.info("Running foo")
}

function bar(a, b, logger) {
  logger.info(`Running bar with ${a} and ${b}`)
}

app.get('/', (req, res) => {
  const requestId = uuid()
  const logger = {
    info: (msg) => console.log(`${requestId} ${msg}`)
  }

  foo(1, logger)
  bar(2, 3, logger)
}

但是这需要显式传递logger对象。我想做的是下游功能

这样的事情
function foo(x) {
  const logger = require('logger')
  logger.info('Running foo') // => "[ce089d84-3679-42ae-b05c-2d0a071062f0] Running foo"
}

1 个答案:

答案 0 :(得分:0)

你可以用域名表达,例如表达。您可以测试此脚本,只需将其保存在文件运行npm i express uniqid然后node index.js中,然后在localhost:8080 / test打开浏览器,只需重新加载它,您就会看到ID更改。

const app = require('express')();
const uniqid = require('uniqid');

app.use((req, res, next) => {
    const nDomain = require('domain').create();
    nDomain.id = uniqid();
    nDomain.add(req);
    nDomain.add(res);
    nDomain.run(next);
    nDomain.on('error', next);
});

app.get('/test', function(req, res) {
    console.log(process.domain.id, 'id');
});

const server = app.listen(8080);

这样,只需在日志记录中创建一个记录器,该记录器在记录时使用process.domain.id。我们在工作中使用类似的东西来跟踪哪个请求触发了日志。

请注意,域名正在等待弃用。请阅读文档https://nodejs.org/api/domain.html