编辑
最后,我创建了一个可以完成所有工作的库. 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();
});
});
Run Code Online (Sandbox Code Playgroud)
之后我不得不包装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;
Run Code Online (Sandbox Code Playgroud)
我认为这有点复杂,所以我决定把它写在一篇文章中.您可以从那里获得更多信息:Express.js:使用全局唯一请求ID记录信息 - Node.js
我希望这有助于解决您的问题.
这个答案有一个问题:每次重新启动节点进程时,计数器都会回到0。事实证明,解决这个问题相当简单。您只需添加一个快速中间件, 使用uuid包标记每个使用UUID调用的请求。
const uuid = require('uuid');
const app = express();
app.use(function (req, next) {
req.id = uuid.v4();
next();
});
Run Code Online (Sandbox Code Playgroud)
const uuidv4 = require('uuid/v4');
const app = express();
app.use(function (req, next) {
req.id = uuidv4();
next();
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7651 次 |
最近记录: |