如果程序执行期间发生错误,我具有将错误记录到日志文件的功能。
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);
但是,为了更具有描述性,我需要打印完整的错误堆栈跟踪而不是仅显示错误消息。
注意:该过程是自动化的,因此无法将错误手动发布到日志文件。
答案 0 :(得分:1)
您可以使用芭蕾舞女演员中现有的日志记录支持来代替编写自己的错误日志记录功能:
import ballerina/log;
function logError(error e){
log:printError("Error sending response", err = e);
}
要将日志发布到文件,请将stderr流重定向到文件。
$ ballerina run program.bal 2> b7a-user.log
查找更多信息here
答案 1 :(得分:1)
在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)
但是请注意,将错误设置为原因仍然无法提供诸如源文件和行号之类的信息。