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

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

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

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

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

1 ответ

Решение

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

  • cls-hooked (для ограниченного запроса)
  • 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));
};

Пока это не изменится, вы уже настроили регистратор для получения 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;
  };
};

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

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