如何在node.js上记录堆栈跟踪进程错误事件

时间:2017-09-20 19:10:58

标签: node.js error-handling

我的节点进程正在消亡,当进程退出时,我似乎无法登录到文件。这是一个长期运行的过程,直接使用node index.js

调用
// index.js
const fs = require('fs');

exports.getAllCars = (process => {
    if (require.main === module) {
        console.log(`Running process: ${process.getgid()}.`);
        let out = fs.createWriteStream(`${__dirname}/process.log`);

        // trying to handle process events here:
        process.on('exit', code => out.write(`Exit: ${code}`));

        return require('./lib/cars').getAllCars();
    } else {
        return require('./lib/cars').getAllCars;
    }
})(process);

还尝试为erroruncaughtException创建事件处理程序。手动终止我的流程(使用kill {pid})时没有任何作用。文件process.log已创建,但没有任何内容。可写流是否需要在完成时调用stream.end()

2 个答案:

答案 0 :(得分:3)

根据Node.js文档:

  

Node.js进程即将退出时会发出'exit'事件   由于以下两者之一:

     
      
  • 明确调用process.exit()方法。
  •   
  • Node.js事件循环不再需要执行任何其他工作。
  •   

所以,如果你开始一个永远不会结束的过程,它永远不会触发。

此外,可写流不需要关闭:

  

如果autoClose(来自createWriteStream的选项)设置为true(默认值   在错误或结束时,文件描述符将被关闭   自动。

但是,createWriteStream函数默认打开带有标记'w'的文件,这意味着每次都会覆盖该文件(这可能就是您总是看到它为空的原因)。我建议使用

fs.appendFileSync(file, data)

以下是想要收听的事件:

//catches ctrl+c event
//NOTE:
//If SIGINT has a listener installed, its default behavior will be removed (Node.js will no longer exit).
process.on('SIGINT', () => {
    fs.appendFileSync(`${__dirname}/process.log`, `Received SIGINT\n`);
    process.exit()
});

//emitted when an uncaught JavaScript exception bubbles
process.on('uncaughtException', (err) => {
    fs.appendFileSync(`${__dirname}/process.log`, `Caught exception: ${err}\n`);
});

//emitted whenever a Promise is rejected and no error handler is attached to it
process.on('unhandledRejection', (reason, p) => {
    fs.appendFileSync(`${__dirname}/process.log`, `Unhandled Rejection at: ${p}, reason: ${reason}\n`);
});

答案 1 :(得分:0)

我建议你把代码放在try catch块中,以找出它的代码或导致程序终止的一些外部原因。 然后检查事件后的日志...

try {
  //your code 
}catch(e) {
  console.log(e.stack);
}