Шаблон журнала: Как распечатать график вызовов только один раз, когда это необходимо - PullRequest
0 голосов
/ 09 января 2019

В моем консольном приложении я хочу печатать сообщения об ошибках с полной глубиной графика только в случае ошибки.

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

Редактировать: Давайте предположим, что я перебираю файловую структуру, подобную этой A - B - C - D
| - X - Z
Я хочу печатать на выход консоли только в случае ошибки.
Для первого примера в примере ошибка может быть в C. Таким образом, при проверке A и B вывод не производится. При проверке C обнаруживается ошибка, и все сообщения информационного уровня (например, имя узлов A и B) должны быть напечатаны до сообщения об ошибке:

  1. Проверка A: без ошибок, вывод: -
  2. Проверка B: нет ошибок, Вывод: -
  3. Проверка C: ошибка, вывод: «Проверка A», «Проверка B», «Проверка C», «Ошибка в C»

Выводятся только выходные данные текущего пути дерева. Для второго примера ошибка может возникнуть в Z:
1. Проверка A: без ошибок, вывод: -
2. Проверка B: без ошибок, вывод: -
3. Проверка C: без ошибок, вывод: -
4. Проверка D: без ошибок, вывод: -
5. Проверка X: без ошибок, вывод: -
6. Проверка Z: ошибка, вывод: «Проверка A», «Проверка B», «Проверка X», «Проверка Z», «Ошибка в Z»

Edit: Это мое текущее решение.

public class Log {
private static final int indentStep = 4;
static public int indent = 1;
static private ArrayList<String> messages = new ArrayList<String>();

static public void incIndent() {
    indent += indentStep;
}

static public void decIndent() {
    indent = indent > indentStep ? indent - indentStep : 1;
}

public static void log(final Object msg) {
    System.out.println(String.format("%" + indent + "c", ' ') + msg);
}

public static void logError(final Object msg) {
    System.err.println(String.format("%" + indent + "c", ' ') + msg);
}

public static int push(String s) {

    messages.add(String.format("%" + indent + "c", ' ') + s);
    return messages.size() - 1;
}

public static void error(String e) {

    for (String s : messages) {
        System.out.println(s);
    }
    messages.clear();
    System.err.println(String.format("%" + indent + "c", ' ') + e);
}

public static void pop(int i) {
    while (messages.size() > i) {
        messages.remove(i);
    }
}

}

Теперь метод, использующий его, выглядит следующим образом:

void validateChecksumFile(){
    int logLevel = Log.push("Title");
    if(errorCondition){
        Log.error("Errormessage");
    }
    Log.pop(logLevel);
}

Где «Заголовок» печатается, только если после него напечатано «Сообщение об ошибке».
Это соответствует моим функциональным требованиям, но я думаю, что должно быть более простое решение.

...