在 Feathersjs 中使用 Winston 显示关联 ID
Show Correlation Id Using Winston in Feathersjs
我想使用 winston 登录 FeathersJS。但是,我想用 "correlation id" 登录。我想找到我应该如何创建记录器,我只想记录消息,而不是提供相关 ID。这是一个例子。
log.info('Here is a log');
// output [Info] [correlation-id] : Here is a log
我想知道如何让我的记录器注入每个请求都不同的相关 ID 的最佳方法?
我的问题有解决方案。但我仍然不确定这是否有效。我使用
这样的库
- cls-hooked(针对范围请求)
- uuid(生成一个id)
这是我第一次生成 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
中的 correlationId。这是我的例子:
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;
};
};
当我设置它时,我认为它已经满足我的要求了。但我仍然需要用另一个案例来测试这个。我只是用一些简单的案例进行测试。
我想使用 winston 登录 FeathersJS。但是,我想用 "correlation id" 登录。我想找到我应该如何创建记录器,我只想记录消息,而不是提供相关 ID。这是一个例子。
log.info('Here is a log');
// output [Info] [correlation-id] : Here is a log
我想知道如何让我的记录器注入每个请求都不同的相关 ID 的最佳方法?
我的问题有解决方案。但我仍然不确定这是否有效。我使用
这样的库- cls-hooked(针对范围请求)
- uuid(生成一个id)
这是我第一次生成 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
中的 correlationId。这是我的例子:
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;
};
};
当我设置它时,我认为它已经满足我的要求了。但我仍然需要用另一个案例来测试这个。我只是用一些简单的案例进行测试。