Nodejs在生产中调试错误

时间:2016-12-14 13:50:45

标签: node.js debugging

我在生产中运行了一个nodejs脚本

我不太可能(曾经一千次)得到这样的错误:

TypeError: value is out of bounds
    at checkInt (buffer.js:1009:11)
    at Buffer.writeUInt16LE (buffer.js:1067:5)
    at Object.foo.bar (/fake/path/name.js:123:1);
    at Object.foo.bar2 (/fake/path/name2.js:123:1);
    at Object.foo.bar3 (/fake/path/name3.js:123:1);

导致生产服务器崩溃......

太棒了我有一个堆栈跟踪!但我想知道每个电话或所有数据的当前数据是什么?

用于在生产代码上进行错误记录(使用它的当前数据)有哪些很棒的工具或代码?

5 个答案:

答案 0 :(得分:7)

我强烈建议您使用 Winston Bunyan 。选择npm包是您的应用程序的决定。

您可以通过浏览npm页面中的统计信息来对可用的npm软件包进行基准测试。统计数据基本上如下。

  1. 在最后一天下载
  2. 上周下载
  3. 上个月下载
  4. 打开问题并打开拉取请求。
  5. 最近有更多的下载量表明从长远来看,您正在使用的模块有很大的支持。所以这很重要。

    Winstan和Bunyan都是市场上最好的npm软件包,主要区别在于,Winstan对于正常的日志记录来说非常棒且灵活。当然,Winstan提供了大量的日志记录功能。但是,与Bunyan相比,要想利用这些功能,需要付出一些努力。

    另一方面,Bunyan特别支持“分析日志”的事实。所以基本上Bunyan用于日志处理。因此,如果您想分析日志,日志文件,强烈建议您使用Bunyan。使用Bunyan调整日志对Winstan来说相当容易。

    我对Bunyan和Winstan进行了彻底的比较。请查看下面的链接,查看Winstan和Bunyan如何使用,具体取决于登录Node应用程序的范围,用例和必要性。 链接:https://docs.google.com/document/d/1pD9PLyxlcHVxxOvserNLO9tAz-QA_Co-xo6cWLhLghc/edit?usp=sharing

    同样在生产环境中,请确保明智地使用日志记录级别。生产环境中最常用的日志记录级别是:

    • 错误
    • 信息
    • 调试

答案 1 :(得分:4)

您可以使用WinstonPino

使用winston,您可以在需要的地方加载许多模块,也可以在线存储日志。我从不使用皮诺,但我已经读过很好的东西了。

设置env变量以选择输出日志的位置,例如,只有在开发时才会在stdout上显示输出,并且仅当应用程序处于生产状态时才在线存储。

答案 2 :(得分:1)

node.js中处理异步函数的好方法是使用 decofun debug tool

它的主要特征是根据上下文解析匿名函数的代码和名称。

您可以<{1}}

运行去匿名任何匿名功能

一个简单的例子就像documentation

中提到的那样
deco filename.js

因为它带有嵌入式cute-stack库,它规范了当前目录的路径

通过应用命令function gravy() { return function returnedᅠfromᅠgravyᅠㅣlineᅠ2 () { return { prop: function asᅠpropertyᅠpropᅠㅣlineᅠ4 () { setTimeout(function passedᅠintoᅠsetTimeoutᅠㅣlineᅠ5 () { console.trace('Getting a trace...'); }, 10) } } } } Trace: Getting a trace... at passedᅠintoᅠsetTimeoutᅠㅣlineᅠ5 [as _onTimeout] (/home/ubuntu/workspace/node_modules/decofun/examples/loadable/index.js:6:22) at Timer.listOnTimeout (timers.js:92:15)  输出将显示为

enter image description here

最好的东西我喜欢它是根据对原始的调用来转换函数,如本例中所示

deco examples/loadable --cute table

进入此

   function one (a, cb) {

}


one('blah', function () {

})

function two () {
  return function () { }
}


function three () {
  return {
    shoe: function () {}
  }
}

function four () {
  return function () { 
    return function () {

    }
  }
}

function five () {
  return function () {
    return function () {
      return function () {
        foo('blue', function () {

        })
      }
    }
  }
}


var six = function () {

}


var seven = function (err, cb) {

  return function () {
    cb(function () {

    })
  }

}

var o = {};
o.eight = function (cb) { }


o.eight(function () { })

o.eight.nine = function () {}
o.eight.nine(function () { })

var o2;

o2 = function () { }


;(function () {}())

!function () { }()



function toodeep () {
  return function () {
    return function () {
      return function () {

        return function () {
          return function () {
            return function () {

              return function () {
                return function () {
                  return function () {

                    return function () {

                    }                     

                  }
                }
              } 

            }
          }
        }        
      }
    }
  }
}

希望这可能会有所帮助!干杯!

答案 3 :(得分:1)

我正在使用pm2,它是node.jsrollbar错误报告的流程管理员。我认为你应该为你的代码部分定义一些这个错误的指标。

答案 4 :(得分:1)

对于任何uncaughtException,服务器将停止以使服务器继续运行,即使存在未捕获的异常,我所做的是创建一个单独的集合来存储错误,一旦发生未捕获的异常并保存错误并返回。< / p>

<强>集合

var ErrorSchema = new mongoose.Schema({
  err_Message:{type:String},
  err_Stack:{type:String},
  date:{type:Date}
});

<强>控制器

process.on('uncaughtException', function (err) {
    console.log(err);
    console.error((new Date).toUTCString() + ' uncaughtException:', err.message);
    console.error(err.stack);

    var newError = new Error;
    newError.err_Message = err.message;
    newError.err_Stack = err.stack;
    newError.date = moment();
    newError.save(function(saveErr,errData){
        if(!saveErr)
            console.log('New Error is saved');
        else
            console.log('Error in saving error');
    });
    //process.exit(1)
});

上述方法将未捕获的异常存储在错误集合中,并且进程/服务器不会停止。

希望这会有所帮助。