Мы имели такую же проблему в нескольких проектах, и я не мог Finde любого полное решения этого вопрос , Мы используем те же технологии (Node.js, Express.js и Winston для журналов) Я нашел решение для этого, используя пару библиотек и обернув библиотеку Winston: - node-uuid для создания уникальных идентификаторов для каждого запроса - продолжение -local-storage для обмена этими идентификаторами между различными модулями без отправки объекта 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, оправившись идентификатор из контекста и добавление к сообщению журнала:
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: Logging info with global unique request ID – Node.js
Я надеюсь, что это поможет с вашей проблемой.
Если вы открываете для использования ES6, вы можете использовать 'Symbol' – MayorMonty
Хотелось бы, но я застрял на 0.10.13 на данный момент – smokedice
@MayorMonty, как бы это помогло? – milan