Как напечатать полную трассировку ошибки в Ballerina - PullRequest
0 голосов
/ 17 октября 2018

У меня есть функция для записи ошибок в файл журнала, если во время выполнения программы произошла ошибка.

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);

Однако мне нужно распечатать полную трассировку стека ошибок, а не просто сообщение об ошибке, чтобы быть более информативным.

ПРИМЕЧАНИЕ. Процесс автоматизирован и поэтому не может вручную публиковать ошибки в файле журнала.

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В стеках балерины следы связаны только с ошибками, которые выдают.Обычно вы будете возвращать ошибки, а не выбрасывать, в этом случае у вас не будет способа получить трассировку стека.Если вы действительно хотите получить трассировку стека из возвращенных ошибок, вы можете установить ошибку, возвращаемую из вызова функции, как причину ошибки, которую вы возвращаете из текущей функции.Затем вы можете использовать эту цепочку причин, чтобы создать собственную трассировку стека.В приведенном ниже примере есть оба случая: выданная ошибка и возвращенная ошибка (с указанием причин).

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)

Обратите внимание, чтоустановка ошибок как причин по-прежнему не дает вам такой информации, как исходный файл и номер строки.

0 голосов
/ 17 октября 2018

Вместо написания своей собственной функции регистрации ошибок вы можете использовать существующую поддержку ведения журнала в ballerina:

import ballerina/log;

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

Чтобы опубликовать журналы в файл, перенаправьте поток stderr в файл.

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

Подробнее здесь

...