我在生产中运行了一个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);
导致生产服务器崩溃......
太棒了我有一个堆栈跟踪!但我想知道每个电话或所有数据的当前数据是什么?
用于在生产代码上进行错误记录(使用它的当前数据)有哪些很棒的工具或代码?
答案 0 :(得分:7)
我强烈建议您使用 Winston 或 Bunyan 。选择npm包是您的应用程序的决定。
您可以通过浏览npm页面中的统计信息来对可用的npm软件包进行基准测试。统计数据基本上如下。
最近有更多的下载量表明从长远来看,您正在使用的模块有很大的支持。所以这很重要。
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)
使用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)
输出将显示为
最好的东西我喜欢它是根据对原始的调用来转换函数,如本例中所示
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)
答案 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)
});
上述方法将未捕获的异常存储在错误集合中,并且进程/服务器不会停止。
希望这会有所帮助。