记录模式:如何仅在必要时打印一次调用图

时间:2019-01-09 14:31:33

标签: c++ logging design-patterns

在我的控制台应用程序中,我只希望在出现错误时以完整的图形深度打印错误消息。

我通过递归遍历所有节点来验证图样(Json)数据。如果将为一个叶子节点打印一条错误消息,则我想(延迟)在该第一条叶子错误消息之前输出所有父节点的名称。

编辑:让我们假设我正在遍历这样的文件结构
A-B-C-D
| -X-Z
我只想在出现错误时才打印到控制台输出。
对于第一个示例,示例可能在C中出错。因此,在验证A和B时,不会进行输出。在检查C时,会注意到该错误,并且所有Info-Level消息(例如,节点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字错误”

编辑: 现在这是我当前的解决方案。

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

仅当在其后打印“ Errormessage”时才打印“ Title”。 这符合我的功能要求,但我认为必须有一个更简单的解决方案。

0 个答案:

没有答案