Node.js: Winston: могу ли я добавить метаданные по умолчанию ко всем сообщениям журнала - PullRequest
22 голосов
/ 21 февраля 2012

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

Ответы [ 5 ]

41 голосов
/ 17 августа 2016

Для Winston 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*/
        ]
});
21 голосов
/ 22 февраля 2012

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

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

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

Затем переопределите метод log () (он всегда вызывается методами уровня - 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). Затем он вызывает метод Winston Logger.log из соответствующего контекста.

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

module.exports = logger;

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

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

Надеюсь, это поможет!

14 голосов
/ 07 августа 2018

Для Winston v3:

const addAppNameFormat = winston.format(info => {
  info.appName = "My Program";
  return info;
});

const logger = winston.createLogger({
  format: winston.format.combine(
    addAppNameFormat(),
    winston.format.json()
  ),
transports: [new winston.transports.Console()]
});

logger.warn('Danger Will Robinson!');
// {"message":"Danger Will Robinson!","level":"warn","appName":"My Program"}

См .: https://github.com/winstonjs/winston/blob/HEAD/UPGRADE-3.0.md#migrating-filters-and-rewriters-to-formats-in-winston3

3 голосов
/ 22 июля 2014

Еще одна опция с выводом, более похожим на log4j (s):

В консольном транспорте есть (в настоящее время недокументированное) свойство label, которое добавит метку к выводу (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 голосов
/ 02 мая 2016

Я нашел лучший способ, используя util-extension , основываясь на том, что я прочитал в этом блоге .Он будет добавлять данные во всех случаях, которые я нашел полезными для перехвата logger.info против logger.log («информация», сообщение), и не будет перезаписывать другие ваши аргументы.

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

Выводит вконсоль и в ваших логах.

...