Обезьяна исправляет логирование узла js winston

У вас есть идея, как обезьяна исправлять методы ведения журнала node js winston, такие как информация, отладка с помощью shimmer (https://www.npmjs.com/package/shimmer)?

Например, это моя установка Winston 3.x:

let winston = require('winston')
   winstonInit = winston.createLogger({
      format: winston.format.json(),
      transports: [
        new winston.transports.Console({ level: 'info' }),
        new winston.transports.File({
          name: 'winston-logging',
          level: 'info',
          filename: './log/winston.log',
          handleExceptions: true
        })
      ],
      exceptionHandlers: [
        new winston.transports.File({ filename: './log/exceptions.log', handleExceptions: true})
      ]
    });
    winston.add(winstonInit);

Итак, в моем приложении я могу назвать этоwinston.info('send this message to Slack') // output: send this message to Slack. Помимо отображения сообщения, мы также выполняем другие функции.

Я просто хочу, чтобы обезьяна исправила этот winston.info(), например, добавив некоторые дополнительные функции, такие как отправка уведомлений о сообщениях Slack при запуске winston.info. Спасибо.

1 ответ

Этого можно добиться двумя способами:

А. shimmer путь:

var shimmer = require('shimmer');

// Assuming that an instance of winston is accesible.
shimmer.wrap(winston, 'info-interceptor', (winstonCall) => {
    return function(arguments) {
        // arguments are the log messages sent to the winston method for logging.
        console.log(arguments)
        
        // check if executed winston function is winston.info or not.
        if(winstonCall.name === 'info'){
           // add logic to send arguments to a slack message
        }
        
        // it is important to return the original call.
        retirm winstonCall;
    }
});

Примечание: не рекомендуется использовать function.name метод, поэтому я бы посоветовал не использовать способ мерцания.

Б. non-shimmer путь

Вы можете обновить конфигурацию Winston для выполнения дополнительных функций всякий раз, когда информационный метод выполняется следующим образом:

let winston = require('winston')
   winstonInit = winston.createLogger({
      format: winston.format.json(),
      transports: [
        new winston.transports.Console({ level: 'info' }),
        new winston.transports.File({
          name: 'winston-logging',
          level: 'info',
          filename: './log/winston.log',
          handleExceptions: true
        }),
        new HttpStreamTransport({
            url: 'https://yourdomain.com/log'
        })
      ],
      exceptionHandlers: [
        new winston.transports.File({ filename: './log/exceptions.log', handleExceptions: true})
      ]
    });
    
    // winston.add(winstonInit);

    const logger = {
       _sendMessageToSlack: (msg) => {
           // logic for sending message to slack
        
           return message;
       },
       info: (msg) => winstonInit.info(logger._sendMessageToSlack(msg)),
       warn: (msg) => winstonInit.warn(msg),
       error: (msg) => winstonInit.error(msg),
   };

module.exports = logger;

Это позволит вам импортировать logger экземпляр в различных файлах и использовать его как logger.info(), logger.warn(), logger.error() и выполнять дополнительные функции всякий раз, когда logger.info называется.

Другие вопросы по тегам