处理node.js中的错误和异常

时间:2016-08-24 04:24:47

标签: node.js error-handling exception-handling

我是开发的新手,今年早些时候开始使用node.js并非常喜欢它。我一直在逐步增加node.js中的日志记录机制。从console.log开始,现在正在使用RAM磁盘将所有内容记录到RAM磁盘中的文件中。

这种登录RAM磁盘的方法接近我的要求。我不想要永久文件,但我确实想要一些持久性,这样如果我的node.js崩溃,我就不会丢失我以前的日志。我正在永远使用自动重启节点,这意味着我没有活动终端,我可以实时查看日志和错误。相反,我有一个GET方法,它从RAM磁盘读取所有日志并将其提供给我。

以下是我在RAM磁盘和内存缓冲区中保存日志的代码:

function generateLog(level, logMsg) {

    var logLevel;

    if(level == levelOff)
        return; // no need to go any further, logging has been disabled.
    else if(level == levelDebug)
        logLevel = "DEBUG: ";
    else if(level == levelInfo)
        logLevel = "INFO: ";
    else if(level == levelWarning)
        logLevel = "WARNING: ";
    else if(level == levelError)
        logLevel = "ERROR: ";
    else if(level == levelException)
        logLevel = "EXCEPTION: ";

    if (level >= loggingLevel){
        console.log(logLevel + logMsg);

        checkIfFileExists(logFile, function(err,status){

            if(err){    // if file does not exist, save it to memory buffer

                logBuffer = logBuffer + '<br>' + logLevel + logMsg; // memory
            }
            else{   // file exists - save it to this file in RAM_disk

                fs.appendFile(logFile, logLevel + logMsg + '\n', function(err) {

                    if(err) {
                        return console.log(err);
                    }

                }); 

            }

        });

    }

}

问题是当节点进程由于异常或错误而崩溃时,那么就不会记录到RAM磁盘。

请建议如何记录节点中的错误和异常。

1 个答案:

答案 0 :(得分:2)

当nodejs检测到未处理的错误时,它将崩溃。 你需要有一个process.on('uncaughtException')钩子来捕获并记录错误。一个例子是;

process.on('uncaughtException', function (err) {
    if (err) {
        console.log("caughtException but no error msg" + err.stack);
        process.exit(1);
    }
});

此钩子只应用于检测问题。当这种情况发生时通常无法恢复,因此退出流程是个好主意。您将在日志中拥有堆栈以查看实际故障。

您可能还想添加process.on('exit')挂钩,以确定进程是否因应用程序错误或其他方式而崩溃;例如“systemctl restart”。