Показать идентификатор корреляции с помощью Winston в Feathersjs - PullRequest
0 голосов
/ 19 апреля 2019

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

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

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

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

1 Ответ

1 голос
/ 19 апреля 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...