如何收集捕获Node中的未处理的错误异常信息?


发布者 ourjs  发布时间 1521167656928
关键字 JS学习  Node.JS 

因为我们的产品主要是以js栈为主,下面来讲一下我们实践。

e.stack 异常栈

node.js是出错异常了,最关键是要知道哪错了。stack是error很重要的一个属性,可以帮助我们了解代码到底是执行哪一行出错了,比如某个error 的 stack:

Error: "start" option must be <= "end" option
    at new ReadStream (fs.js:1931:13)
    at Object.fs.createReadStream (fs.js:1885:10)
    at /var/www/oncedoc/mod/onceoa-oncedoc/svr/onceoa.web.js:1:2315
    at FSReqWrap.oncomplete (fs.js:123:15)

Node.JS异常处理

node.js 因欺回调的特性,一般采取错误前置的写法(Error First),即回调中第一个参数就为错误信息。在这个时侯可以直接将错误输出到 stderr 的命令行日志中,方便从日志中分析。

var getFolderTree = function(folderPath, tree, cb) {
  fs.readdir(folderPath, function(err, files) {
    if (err) {
      console.error(err)
      cb && cb(err, tree)
      return
    }

Node.JS未知异常捕获

因为是动态脚本语言,但有时也会漏掉异常捕获,这几乎是无法避免的,这时就可以在uncaughtException 中借助 e.stack 打印调出用栈。将未捕获的异常其找出来。

process.on('uncaughtException', function (err) {
  /*
  console.error may not exist in some version of node
  https://github.com/nodejs/node/issues/4467
  */

  if (typeof console.error === "function") {
    console.error((err || '').toString())
    console.error(err.stack || '')
  } else {
    console.log((err || '').toString())
    console.log(err.stack || '')
  }
})


将异常写入日志

这是最关键的一步,上面我们已经将所有的 error 都输出到了 stderr 中,这时侯就要从命令行写入日志文件,在linux中调用node程序时可以这样简单实现:

while true; do
    {
        /usr/local/bin/node /var/www/oncedoc/svr/oncedoc.js config.live.js
        echo "OnceDoc stopped, restarting \r\n\r\n"
    } 2>> /var/www/oncedoc/error.log
    sleep 1
done

2 代表是 stderr 中的错误信息,可以调成 1 或 0,此时可以输出所有日志。

将这段脚本加入自动启动服务即可。

这段代码也有一定的缺陷,会block住当前的shell脚本,在实践中,我们会以一个node.js service启动另一个service,类似 forever,即守护进程。

并且我们将所有session都放入了redis,即使发生异常,也能瞬间重启,让用户感觉不到。

然后每隔一段时间排查错误日志,即可消除node中的所有异常。









 热门文章 - 分享最多
  1. 用jQuery创建一个可编辑的SELECT下拉控件(HTML/CSS)
  2. 全国211高校数量最多省市排名:北京、上海、南京、武汉、西安最多,附高考难易地图
  3. Node.JS段点续传:Nginx配置文件分段下载功能实现
  4. 如何用Bootstrap免费网站模板和OnceAir云盘搭建个人网站服务器
  5. Node.JS如何查看本地MAC/IP地址、计算cpu使用率和内存容量
  6. Node.JS高效压缩解压zip文件:将child_process执行结果输入stdout流
  7. IE、Chrome、Firefox浏览器默认首页被改成360导航解决办法(删除daohang88.com)跳转
  8. OnceAir自动考勤系统,无需手机签到打卡,轻松管理记录员工出勤信息
  9. Node.js 和 JavaScript 的最新版 npm 导致 Linux 系统崩溃,迫使用户重装系统!
  10. Node.JS循环删除非空文件夹及子目录下的所有文件

 相关阅读
  1. Node.JS循环删除非空文件夹及子目录下的所有文件
  2. Node.js 和 JavaScript 的最新版 npm 导致 Linux 系统崩溃,迫使用户重装系统!
  3. 用jQuery创建一个可编辑的SELECT下拉控件(HTML/CSS)
  4. 如何用Bootstrap免费网站模板和OnceAir云盘搭建个人网站服务器
  5. Node.JS高效压缩解压zip文件:将child_process执行结果输入stdout流
  6. Node.JS段点续传:Nginx配置文件分段下载功能实现
  7. Node.JS如何查看本地MAC/IP地址、计算cpu使用率和内存容量
  8. JavaScript数组从头开始的位置插入新元素或删除第一个元素
  9. Node.JS中UDP打洞穿透内网路由,架设内网服务器技术详解及源码
  10. 移动端开发框架哪个好?jQuery/Vue/AngularJS有哪些区别和优缺点?

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA