如何在 Ballerina 中打印完整的错误堆栈跟踪

How to print the complete error strack trace in Ballerina

如果在程序执行期间发生错误,我有一个功能可以将错误记录到日志文件中。

string LOG_LEVEL_ERROR = "ERROR";
public function logError(string message){
    var logTime = getTime();

    string strLog = logTime + " - " + LOG_LEVEL_ERROR + " - " + message;
    writeToFile(strLog);
}

它的调用如下。这会将错误消息成功写入日志文件。

logError("[ERROR] cleanup failed " + e.message);

然而,为了更具描述性,我需要打印完整的错误堆栈跟踪,而不仅仅是错误消息。

注意:该过程是自动化的,因此无法手动将错误发布到日志文件。

您可以使用 ballerina 中现有的日志记录支持,而不是编写您自己的错误日志记录函数:

import ballerina/log;

function logError(error e){
   log:printError("Error sending response", err = e);
}

要将日志发布到文件,请将 stderr 流重定向到文件。

$ ballerina run program.bal 2> b7a-user.log

查找更多信息here

在 Ballerina 中,堆栈跟踪仅与抛出的错误相关联。通常,您会返回错误而不是抛出错误,在这种情况下您将无法获得堆栈跟踪。如果您真的想要从返回的错误中跟踪堆栈,您可以将函数调用返回的错误设置为从当前函数返回的错误的原因。然后您可以使用这些原因链来构建您自己的各种堆栈跟踪。下面的例子有两种情况:抛出的错误和返回的错误(设置了原因)。

import ballerina/io;

public function main() {
    error e = returnedError();
    io:println(e);
    io:println();
    thrownError();
}

function thrownError() {
    test1();
}

function test1() {
    error e = {message: "ERROR from test 2"};
    throw e;
}

function returnedError() returns error {
    error e = test2();
    return {message: "ERROR from test 3", cause: e};
}

function test2() returns error {
    return {message: "ERROR from test 4"};
}

以上程序将产生以下输出。

{message:"ERROR from test 3", cause:{message:"ERROR from test 4", cause:null}}

error: ballerina/runtime:CallFailedException, message: call failed
    at main(test.bal:7)
caused by ballerina/runtime:CallFailedException, message: call failed
    at thrownError(test.bal:11)
caused by error, message: eRROR from test 2
    at test1(test.bal:16)

但请注意,将错误设置为原因仍然不会为您提供源文件和行号等信息。