#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. Идентификатор идентификатора корреляции может быть заменен другим.