NodeJS Express-全局唯一请求ID
是否可以定义每个日志语句中包含的唯一请求ID,而无需将记录器交给每个方法/函数调用?
使用的技术:NodeJS,Express,Winston
回答:
最后,我创建了一个库,可以完成所有工作。 https://github.com/davicente/express-logger-unique-req-
id
它是Winston库的包装,因此您可以以相同的方式使用它。
让我知道这是否对您有帮助
我们在多个项目中都遇到了同样的问题,但我找不到针对该问题的完整解决方案。我们使用相同的技术(Node.js,Express.js和Winston记录日志),我找到了一个解决方案,它使用了几个库并包装了Winston库:-node-
uuid,用于为每个请求创建唯一的标识符-continuation-local-用于在不同模块之间共享此ID的存储,而无需在所有调用中发送req对象。
首先,我需要为每个请求创建并设置唯一标识符。我在中间件中做到这一点:
var uuid = require('node-uuid');var createNamespace = require('continuation-local-storage').createNamespace;
var myRequest = createNamespace('my request');
// Run the context for each request. Assign a unique identifier to each request
app.use(function(req, res, next) {
myRequest.run(function() {
myRequest.set('reqId', uuid.v1());
next();
});
});
之后,我必须包装Winston库,从上下文中恢复ID并添加到日志消息中:
var winston = require('winston');var getNamespace = require('continuation-local-storage').getNamespace;
// Wrap Winston logger to print reqId in each log
var formatMessage = function(message) {
var myRequest = getNamespace('my request');
message = myRequest && myRequest.get('reqId') ? message + " reqId: " + myRequest.get('reqId') : message;
return message;
};
var logger = {
log: function(level, message) {
winstonLogger.log(level, formatMessage(message));
},
error: function(message) {
winstonLogger.error(formatMessage(message));
},
warn: function(message) {
winstonLogger.warn(formatMessage(message));
},
verbose: function(message) {
winstonLogger.verbose(formatMessage(message));
},
info: function(message) {
winstonLogger.info(formatMessage(message));
},
debug: function(message) {
winstonLogger.debug(formatMessage(message));
},
silly: function(message) {
winstonLogger.silly(formatMessage(message));
}
};
module.exports = logger;
我认为这有点复杂,因此我决定将其写下来。您可以从那里获得更多信息:Express.js:使用全局唯一请求ID –
Node.js记录信息
希望这对您的问题有所帮助。
以上是 NodeJS Express-全局唯一请求ID 的全部内容, 来源链接: utcz.com/qa/424664.html