Как изменить формат журнала winston?

В моем приложении node я использую модуль winston для хранения журналов приложений. Мы можем хранить журналы в двух форматах: json, а другой - строка. Сохраняя журнал как строку в winston, я становлюсь ниже формата журнала.

  2013-09-10T06:51:34.199Z - error: error message!!!
       (timestamp)     -    (level) : (log message)

Теперь я хочу изменить приведенный выше формат журнала на следующее:

    2013-09-10T06:51:34.199Z/error/error message!!!
       (timestamp)    /     (level) / (log message)

Как это можно достичь?

Мой код:

  var winston = require('winston');
  winston.loggers.add('category1', {
   file: {
      filename: '/path/to/some/file',json:false
     }
  });              
  var category1 = winston.loggers.get('category1');
  category1.log('error','error message!!!');

Ответ 1

Мне было интересно то же самое и найти подходящее решение (хотя и не идеальное IMO, поэтому, возможно, кто-то еще может взвесить это).

Вы можете полностью настроить вывод журнала, предоставив вашему транспортному объекту функцию форматирования. Это может быть лучше для Транспортировки файлов, чем Консоль, так как вам придется вручную раскрасить шрифт, если это вам нужно.

Вот относительно простая функция форматирования, которую вы можете использовать (и настроить для своих нужд):

// Define options for Date#toLocaleTimeString call we will use.
var twoDigit = '2-digit';
var options = {
  day: twoDigit,
  month: twoDigit,
  year: twoDigit,
  hour: twoDigit,
  minute: twoDigit,
  second: twoDigit
};

function formatter(args) {
  var dateTimeComponents = new Date().toLocaleTimeString('en-us', options).split(',');
  var logMessage = dateTimeComponents[0] + dateTimeComponents[1] + ' - ' + args.level + ': ' + args.message;
  return logMessage;
}

И чтобы использовать этот форматтер в вашем транспорте, просто настройте свой код, чтобы передать функцию в:

winston.loggers.add('category1', {
  file: {
    filename: '/path/to/some/file',
    json: false,
    formatter: formatter
  }
});

Стоит отметить, что свойство args.meta будет установлено на любой объектный аргумент, который передается в вызов метода журнала. Таким образом, вам придется придумать стратегию обработки переданных объектов (или просто распечатать весь объект как JSON). Например:

var error = {
  name: 'MongoError',
  code: 11000,
  err: 'insertDocument :: caused by :: 11000 E11000 duplicate key error...'
}
logger.info('Some error ocurred: ', error);

В результате будет args.meta установлено значение переменной.

Как вы можете видеть, существует достаточная сумма для обработки сообщений журналов таким образом. Я не удивлюсь, если бы был лучший способ сделать это, но, надеюсь, это поможет вам (или кому-то еще) выйти.