如何在日志文件中记录每个请求和错误

时间:2018-11-21 10:10:56

标签: node.js

我已经创建了一个中间件来记录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();
}

2 个答案:

答案 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'
    });
}