NodeJS Express - 全局唯一请求 ID
NodeJS Express - Global Unique Request Id
是否可以定义包含在每个日志语句中的唯一请求 ID,而无需将记录器交给每个 method/function 调用?
使用的技术:NodeJS、Express、Winston
在请求处理的最开始添加如下内容(或将其放在自己的文件中):
var makeID = (function() {
var index = 0;
return function() {
return index++;
}
})();
app.use(function(req, res, next) {
req.id = makeID()
next()
})
这将为每个请求提供一个唯一的(连续的)ID。 不允许人们用它来标识自己,只能在内部使用它!
登录 Winston 时,您可以输入元数据,显示在消息之后(以 ${name}=${value}
的形式),如下所示
app.use(function(req, res) {
winston.log('info', 'Test Log Message', { id: req.id });
res.end("Done.")
});
希望这对您有所帮助。
has a problem: the counter goes back to 0 every time the node process is restarted. Turns out there is fairly simple to work around. You simply add an express middleware that tags each request called with a UUID using the uuid 包。
对于 uuid 2.0 之前的版本
const uuid = require('uuid');
const app = express();
app.use(function (req, next) {
req.id = uuid.v4();
next();
});
uuid 3.0+
const uuidv4 = require('uuid/v4');
const app = express();
app.use(function (req, next) {
req.id = uuidv4();
next();
});
已编辑
最后,我创建了一个可以完成所有工作的库。
https://github.com/davicente/express-logger-unique-req-id
它是Winston库的包装器,所以你可以用同样的方式使用它。
如果对你有帮助请告诉我
我们在几个项目中遇到了同样的问题,我找不到这个问题的完整解决方案。我们使用相同的技术(Node.js、Express.js 和 Winston 用于日志)
我使用几个库和包装 Winston 库找到了解决方案:
- node-uuid 用于为每个请求创建唯一标识符
- continuation-local-storage 用于在不同模块之间共享此 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;
我觉得有点复杂,所以我决定写在post中。您可以从那里获得更多信息:Express.js: Logging info with global unique request ID – Node.js
希望这对您的问题有所帮助。
是否可以定义包含在每个日志语句中的唯一请求 ID,而无需将记录器交给每个 method/function 调用?
使用的技术:NodeJS、Express、Winston
在请求处理的最开始添加如下内容(或将其放在自己的文件中):
var makeID = (function() {
var index = 0;
return function() {
return index++;
}
})();
app.use(function(req, res, next) {
req.id = makeID()
next()
})
这将为每个请求提供一个唯一的(连续的)ID。 不允许人们用它来标识自己,只能在内部使用它!
登录 Winston 时,您可以输入元数据,显示在消息之后(以 ${name}=${value}
的形式),如下所示
app.use(function(req, res) {
winston.log('info', 'Test Log Message', { id: req.id });
res.end("Done.")
});
希望这对您有所帮助。
对于 uuid 2.0 之前的版本
const uuid = require('uuid');
const app = express();
app.use(function (req, next) {
req.id = uuid.v4();
next();
});
uuid 3.0+
const uuidv4 = require('uuid/v4');
const app = express();
app.use(function (req, next) {
req.id = uuidv4();
next();
});
已编辑
最后,我创建了一个可以完成所有工作的库。 https://github.com/davicente/express-logger-unique-req-id
它是Winston库的包装器,所以你可以用同样的方式使用它。
如果对你有帮助请告诉我
我们在几个项目中遇到了同样的问题,我找不到这个问题的完整解决方案。我们使用相同的技术(Node.js、Express.js 和 Winston 用于日志) 我使用几个库和包装 Winston 库找到了解决方案: - node-uuid 用于为每个请求创建唯一标识符 - continuation-local-storage 用于在不同模块之间共享此 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;
我觉得有点复杂,所以我决定写在post中。您可以从那里获得更多信息:Express.js: Logging info with global unique request ID – Node.js
希望这对您的问题有所帮助。