我已经创建了一个中间件来记录API的每个请求和错误,有人可以告诉我这样做的最佳实践吗?
logging.js
const winston = require('winston');
module.exports = function(req, res, next) {
const logger = winston.createLogger({
levels: winston.config.syslog.levels,
transports: [
new winston.transports.File({
filename: 'Logs/combined.log',
level: 'info'
})
],
exitOnError: false
});
var logmsg = {
'Request IP':req.ip,
'Method':req.method,
'URL':req.originalUrl,
'statusCode':res.statusCode,
'headers':req.headers,
'Time':new Date()
};
process.on('unhandledRejection', (reason, p) => {
logger.error('exception:'+reason);
res.status(200).json({
'statuscode': 200,
'message': 'Validation Error',
'responsedata': 'Unhandled Exception Occured'
});
});
logger.log('info', logmsg);
next();
}
答案 0 :(得分:2)
假设您使用的是Express或类似产品,请将以下内容添加到配置Express的位置:
const logging = require('$path/to/logging')
const app = express.createServer(options)
app.all('*', logging)
这将使所有请求都调用中间件。
您还应该在中间件调用之外初始化winston,因为它是一次性操作。因此,将winston.createLogger
调用移到函数范围之外。
请注意,process.on('unhandledRejection', handler)
是全局钩子,因此也不应在中间件功能范围内使用它。每个请求最终将有1个侦听器,该侦听器永远不会清理,并且在发生未处理的拒绝时将全部触发。 (由于响应已经发送,因此它们将失败。)
答案 1 :(得分:0)
您可以使用中间件,该中间件将记录您的所有请求。该中间件应放在所有路由的顶部。
app.use((req,res,next)=> {
console.log(`${req.method}- ${req.protocol}:// ${req.get('host')}{req.originalUr}`)
next();
})
您可以使用try-catch来获取错误并将所有错误转移到通用函数。
try{
// all code
}catch(err){
return sendError(res, err);
}
sendError(res, err){
return res.status(200).json({
'statuscode': 200,
'message': err.message,
'responsedata': 'Unhandled Exception Occured'
});
}