在Express.js中使用traceId进行logging

我需要使用跟踪ID生成日志。 目前我们正在使用winston进行日志logging

我正在使用Winston容器如下

var fs = require('fs'); var os = require('os'); var path = require('path'); var winston = require('winston'); var transports = []; module.exports = function(setting) { function formatter(options) { return options.timestamp() +' '+ options.level.toUpperCase() +' '+ (undefined !== options.message ? options.message : ''); } if (setting.log.file) { fs.existsSync(setting.log.path) || fs.mkdirSync(setting.log.path); transports.push(new winston.transports.DailyRotateFile({ handleExceptions: true, json: true, component: setting.customise.app_type, datePattern: setting.log.datePattern, filename: path.join(setting.log.path, setting.log.filename), level: setting.log.level })); } if (setting.log.console || transports.length === 0) { transports.push(new (winston.transports.Console)({ timestamp: function() { return new Date().toISOString(); }, handleExceptions: true, json: false, formatter: formatter, level: setting.log.level, colorize: 'all' })); } winston.loggers.add('defaultLogger', { transports: transports }); var logger = winston.loggers.get('defaultLogger'); logger.exitOnError = false; logger.addFilter(function(msg, meta, level) { if(!meta){ meta = {}; } meta.component= setting.customise.app_type; meta.component_version = setting.app_version; meta.machine = os.hostname(); meta.context = process.pid; return msg; }); }; 

所以在需要做一些日志logging的文件中,简单地做

 var sessionTool = require('sessionTool')(app); var logger = require('winston').loggers.get('defaultLogger'); 

得到快递使用温斯顿

 var winstonStream = { write: function(message, encoding){ logger.info(message.slice(0, -1)); } }; app.use(express.logger({ stream: winstonStream, format: ':remote-addr - - :method :url HTTP/:http-version :status :res[content-length] :referrer :user-agent' })); 

我添加了捕获所有路线来获取/生成跟踪ID

 app.all('*', function(req, res, next){ var traceId = req.params['trace_id']; if(!traceId){ traceId = require('node-uuid').v4(); } req.params['trace_id'] = traceId; }); 

所以问题是:每个调用的唯一跟踪id如何在整个应用程序中可用?

更新:为了确保trace id始终处于使用状态,我正在考虑为每个请求创build一个全局variables,而不是将请求中的variables从请求传递到控制器,然后再次向下,因为这意味着每次都有一个新的控制器或者一个服务被引入,那么我们也必须记住trace id。

我已经结束使用continuation-local-storage来存储trace_id并在日后logging时使用它

将以下内容添加到winstonfilter

 logger.addFilter(function(msg, meta, level) { var nameSpace = require('continuation-local-storage').getNamespace('nameSpace'); .... meta.trace_id = meta.trace_id || nameSpace.get('trace_id'); return msg; } 

并将app.all()函数更改为

 server.all('*', function(req, res, next) { var nameSpace = require('continuation-local-storage').getNamespace('nameSpace'); var traceId = req.get(GLOBAL.com.mdsol.csa.traceIdKey); if (!traceId) { traceId = uuid.v4(); } res.header('trace_id', traceId); nameSpace.run(function() { nameSpace.set('trace_id', traceId); }); });