2012-02-21 2 views
13

Я использую Winston в Node.js для ведения журнала. Я знаю, что я могу добавлять метаданные индивидуально к каждому сообщению журнала, но есть способ указать набор метаданных по умолчанию, который будет добавлен к каждому сообщению журнала (например, имя приложения), поскольку я не хочу указывать его каждый раз Мне нужно отправить сообщение журнала.Node.js: Winston: Могу ли я добавлять метаданные по умолчанию ко всем сообщениям журнала

+0

Существует теперь документированы способ сделать это, увидеть мой ответ. – DrakaSAN

ответ

16

Там нет встроенный способ сделать это, но вы определенно можете добавить его самостоятельно - вот как:

Во-первых, настроить регистратор, как обычно. Например:

var logger = new (winston.Logger)({ 
      "exitOnError" : true, 
      "transports" : [ 
       new (winston.transports.Console)({ "colorize" : true, "level" : "silly", "silent" : false, "handleExceptions" : false }), 
      ] 
     }); 

Затем переопределить метод журнала() (это всегда вызывается с помощью методов уровня - logger.foo() фактически называет logger.log('foo').)

logger.log = function(){ 
    var args = arguments; 
    if(args[2]) args[3] = args[2]; 
    args[2] = { 
    "foo" : "bar" 
    } 
    winston.Logger.prototype.log.apply(this,args); 
} 

Все, что я делаю выше делает это так когда вызывается logger.log(), вместо этого он вызывает вышеуказанный метод, который добавляет метаданные (в данном случае объект, содержащий ключ foo). Затем он вызывает метод Logger.log Winston из соответствующего контекста.

Приведенный выше код будет в модуле вы создаете, в нижней части просто экспортировать регистратор:

module.exports = logger;

и импортировать модуль регистратора вместо модуля Уинстона в ваших вспомогательных классов.

var logger = require('./logger.js');

Надежда, что помогает!

+0

Thanks Jesse :) –

+1

Примечание: это приведет к перезаписыванию любых метаданных, заданных в инструкции журнала. Вы можете использовать '_.defaults()' подчеркивания() 'для увеличения, или вы можете добавить проверку для args [2] и не перезаписывать ее, если она существует, чтобы обойти это. – Jesse

+1

Вместо перезаписи аргументов просто добавьте их: logger.log = function() { var args = arguments; if (args [2]) { args [2] .foo = "bar" } winston.Logger.prototype.log.apply (это, args); } – harryBundles

3

Другой вариант с выходом более как log4j (ы):

Существует а (в настоящее время незарегистрированные) свойство «метка» в транспорте консоли, которая будет добавить метку к выходу (JSon или линии):

var _ = require('lodash'); 
var winston = require('winston'); 
var path = require('path'); 
var baseDir = path.resolve(__dirname, '..'); 

// SETUP WINSTON LOGGER 
var container = new winston.Container(); 
container.add("exception", { 
    console: { 
     handleExceptions: true, 
     timestamp: true, 
     label: "EXCEPTION", 
     colorize: true 
    } 
}); 
container.get("exception").exitOnError = false; 
var keys = []; 

module.exports = function(filename) { 
    var label = path.relative(baseDir, filename); 
    if (!_.contains(keys, label)) { 
     container.add(label, { 
      console: { 
       handleExceptions: false, 
       level: 'debug', 
       timestamp: true, 
       label: label, 
       colorize: true 
      } 
     }); 
     keys.push(label); 
    } 
    var logger = container.get(label); 
    logger.exitOnError = false; 
    return logger; 
}; 

И в других модулях требуют это так:

var logger = require('./logger')(__filename); 

Пример вывода:

2014-07-23T07:05:27.770Z - info: [config/config.js] ....... 
0

Я нашел лучший способ, используя util-extend на основе того, что я читал на this blog. Он будет добавлять данные во всех случаях, которые я нашел полезными для ловушки logger.info vs logger.log («info», message) и не перезаписывать ваши другие аргументы.

logger.log = function(){ 
    var args = arguments; 
    var level = args[0]; 

    var newArgs = { 
     foo: "bar", 
     baz: "abc" 
    }; 
    var originalMeta = args[2] || {}; 
    args[2] = extend(originalMeta, newArgs); 

    winston.Logger.prototype.log.apply(this,args); 
}; 

Будет выводиться в консоли и в ваших журналах.

28

Для Уинстона v2 (см комментариев)

Существует в настоящее время rewriters, которые документально и официальным способ сделать это:

logger.rewriters.push(function(level, msg, meta) { 
    meta.app = 'myApp'; 

    return meta; 
}); 

Будет ли добавить свойство app каждые метаданные происходят Повсеместно это регистратор.
Вы также можете объявить его при создании регистратора:

new (winston.Logger)({ 
     level: config.log[file].level, 
     rewriters: [ 
      (level, msg, meta) => { 
       meta.app = 'myApp'; 
       return meta; 
      } 
     ], 
     transports: [ 
      /*your transports*/ 
     ] 
}); 
+1

Этот ответ является более актуальным и официальным. – shankshera

+0

Должен быть правильный ответ –

+0

winston v3, похоже, устраняет возможность мутации метаданных. Это означает, что @Jesse является предпочтительным решением для winston v3 & +, если вы хотите добавить метаданные. Если выходной журнал является строкой, а не JSON, пользовательский формат может выполнять задание (cf github.com/winstonjs/winston/issues/1140) –

Смежные вопросы