是否可以跟踪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"
}
答案 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