Показать идентификатор корреляции с использованием Winston в Feathersjs

#node.js #feathersjs #winston #feathers-service

#node.js #feathersjs #winston #feathers-сервис

Вопрос:

Я хочу войти в FeathersJS с помощью winston. Но я хочу вести журнал с «идентификатором корреляции». Я хочу найти, как я должен создать регистратор, я хочу просто регистрировать сообщение, а не указывать идентификатор корреляции. Вот пример.

 log.info('Here is a log');

// output [Info] [correlation-id] : Here is a log
 

Я хочу знать, как наилучшим образом сделать так, чтобы моему регистратору вводился идентификатор корреляции, который отличается для каждого запроса?

Ответ №1:

У меня есть решение моего вопроса. Но я все еще не уверен, что это будет эффективно. Я использую библиотеку, такую как

  • cls-подключенный (для определения области запроса)
  • uuid (для сгенерированного идентификатора)

Вот мои изменения после того, как я впервые сгенерировал проект FeathersJS.

В src/logger.js я использую getNamespace, а также получаю переменную из пространства имен. Вот мой пример:

 const { createLogger, format, transports } = require('winston');
const getNamespace = require('cls-hooked').getNamespace;

const myFormat = format.printf(({level, message, timestamp}) => {
  const loggerNamespace = getNamespace('logger');
  return `[${timestamp}] [${level}] [${loggerNamespace.get('correlationId')}]: ${message}`;
});

// Configure the Winston logger. For the complete documentation see https://github.com/winstonjs/winston
const logger = createLogger({
  // To see more detailed errors, change this to 'debug'
  level: 'info',
  format: format.combine(
    format.timestamp(),
    format.splat(),
    myFormat
  ),
  transports: [
    new transports.Console()
  ],
});

module.exports = logger;
 

После этого я закончил настройку своего регистратора для получения CorrelationId, теперь, чтобы сделать корреляцию каждого моего запроса, я использую промежуточное программное обеспечение, чтобы это произошло. Я добавлю новое промежуточное программное обеспечение для управления src/middleware/correlation.js идентификатором корреляции. Вот мой пример:

 const uuidv4 = require('uuid/v4');

function correlation(namespace) {
  return (req, res, next) => {
    const correlationId = uuidv4();
    req.feathers.correlationId = correlationId;
    namespace.run(() => {
      namespace.set('correlationId', correlationId);
      next();
    });
  }
}

module.exports = correlation;
 

После того, как я создал свое собственное промежуточное программное обеспечение, я зарегистрирую его в глобальном промежуточном src/middleware/index.js программном обеспечении. Вот мои изменения,

 const createNameSpace = require('cls-hooked').createNamespace;
const correlation = require('./correlation');
const logNameSpace = createNameSpace('logger');

// eslint-disable-next-line no-unused-vars
module.exports = function (app) {
  // Add your custom middleware here. Remember that
  // in Express, the order matters.
  app.use(correlation(logNameSpace));
};
 

Пока это не изменится, вы уже настроили logger для получения CorrelationId. Например, я создал хук и добавлю туда журнал. Я помещаю это src/hooks/logsHooks здесь в свой пример:

 // Use this hook to manipulate incoming or outgoing data.
// For more information on hooks see: http://docs.feathersjs.com/api/hooks.html
const logger = require('../logger');
// eslint-disable-next-line no-unused-vars
module.exports = function (options = {}) {
  return async context => {
    logger.info('Test my correlation Id');
    let i = 0;
    function recursive() {
      setTimeout(() => {
        logger.debug(`My Itteration ${i}, let it request finish than run this background`);
        i  ;
        if (i < 50) {
          recursive();
        }
      }, 5000);
    }
    recursive();
    return context;
  };
};
 

Когда я это настраиваю, я думаю, что это уже соответствует моим требованиям. Но мне все равно нужно проверить это в другом случае. Я просто тестирую с каким-то простым случаем.

Комментарии:

1. Идентификатор идентификатора корреляции может быть заменен другим.