我怎么知道我的应用程序崩溃时发生了哪个异常?

时间:2019-03-04 12:04:44

标签: node.js express logging

我正在使用NodeJS模块,并且遇到以下问题:

当Promise链中发生错误时,我可以处理该异常,将其记录到集中式日志记录工具中,一切都很好。

但是,我不时看到一些错误,这些错误立即导致应用程序崩溃,并且它重新启动,使我无所事事。只有查看机器中的日志,我才能弄清楚发生了什么。最新的是这样的:

TypeError: Converting circular structure to JSON

如何将导致应用程序崩溃的错误记录到集中式日志工具中。我了解,如果该应用程序死了,它将无能为力。但是必须有一种策略来做到这一点

3 个答案:

答案 0 :(得分:1)

处理异常的最佳方法是创建一个辅助函数,在该函数中必须使用错误记录工具(如heroku中的滚动条)进行配置,并且在每个函数/路由中,都必须在try-catch块中包含源代码。 在try部分中编写代码,并使用helper函数,并将异常传递给helper文件。看起来像这样

//helper.js

const handleException = (exception) => {
//configure your error logging tool here.
}
const internalServerError = env => (err, req, res, next) => {
  if (!err) {
    return next();
  }
  handleException(err)//utilize common handler
};

module.exports = { handleException }

并在主文件中

//app.js
const { handleException, internalServerError } = required('helper');
app.post((req, res) => {
   try {
      //your code will goes here
   } catch(err) {
     handleException(err)//you can customize error as per requirements
   }
});

//uncatch exception will trigger here. Put this bottom of the routes file. 
 app.use(internalServerError());

答案 1 :(得分:0)

在try / catch块中放置任何可能产生错误的表达式。在该错误中进行处理或将其附加新信息进行转发。

try {

   suspectedFunction()
}
catch(e) {

   logError(e)

   if (necessary){
     e.parseSuccess = false;
     throw e
   }

}

答案 2 :(得分:0)

您可以尝试使用带有Express-winston模块express-winston的Winston之类的日志记录库,该库提供了错误记录中间件,例如:

  var express = require('express');
  var expressWinston = require('express-winston');
  var winston = require('winston');
  var app = express();

  app.use(expressWinston.logger({
      transports: [
        new winston.transports.File({ filename: 'express.log' })
      ],
      format: winston.format.combine(
        winston.format.json()
      )
  }));

  app.get('/test', function(req, res, next) {
      res.send('All good');
  });

  app.get('/error', function(req, res, next) {
      // Let's cause an error.
      let r = JSON.stringify(req);
  });

  app.listen(3000, function(){
      console.log(`Express Listening on port ${this.address().port}`);
  });

  app.use(expressWinston.errorLogger({
      transports: [
          new winston.transports.File({ filename: 'express-error.log' })
      ],
      format: winston.format.combine(
          winston.format.json()
      )
  }));