2015-09-22 4 views
1

Мне нужно создать журналы с идентификатором следа. В настоящее время мы используем Winston сделать протоколируемуюРегистрация с traceId в Express.js

Я использую контейнеры 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; 
    }); 
}; 

Таким образом, в файлах, которые необходимо сделать некоторые протоколирование, просто сделать

var sessionTool = require('sessionTool')(app); 

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

, чтобы выразить использовать winston

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' 
    })); 

Я добавил захват всего маршрута, чтобы получить/сгенерировать trac E 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; 
}); 

Так что вопрос: Как уникальный идентификатор трассировки для каждого вызова может предоставляться кап приложение?

UPDATE: Чтобы убедиться, что след идентификатор в используется во все времена, я имею в виду создать глобальную переменную для каждого запроса, не передавая переменную из запроса вниз к контроллерам, а затем снова, как и будет означать, что каждый раз, когда вводится новый контроллер или служба, мы также должны помнить идентификатор трассировки.

+0

У вас есть trace_id на объекте запроса, пока вы переходите от своих контроллеров до сервисов, у вас будет идентификатор трассировки. – masimplo

ответ

1

я окончила с использованием continuation-local-storage для хранения trace_id и использовать его в дальнейшем при входе

Добавьте следующие Winston фильтр

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); 
    }); 
});