2012-03-27 84 views
3

我使用sl4j/logback作为日志记录框架。我不确定正确的方式来记录错误。也就是说,假定e是一个例外,我想记录,我一直犹豫之间:日志记录良好做法

  1. logger.error("Something bad happened: {}\nError: {}", someInfo, e.getMessage());

    我明白这是不好的做法,因为堆栈跟踪丢失 - 并不大明白发生了什么。

  2. logger.error("Something bad happened: {}\nError: {}", someInfo, e.getMessage(), e);

    同时使用e.getMessage()e似乎是多余的,虽然我不知道这是否是可能的,e.getMessage()可能包含,如果我使用,不会被视为额外的信息:

  3. logger.error("Something bad happened: {}", someInfo, e);

    这是我通常使用的语法 - 但我想确保我不会错过任何东西。

回答

2

我通常使用两个号码,但我从来没有打破记录的一条线到2号线(\ n)的,虽然打印堆栈跟踪时,它不会多大关系(在所有其他情况下,它创建当你的日志变得真的很大时,太多的视觉熵)。

为什么我要用2号?

我想立即在第一行看到该消息,因为这是告诉我发生了什么事的第一件事情。有些可能是预期的,我可以安全地跳过它们,有些可能不会。

如果我需要仔细检查发生了什么,我会更好地了解一下堆栈跟踪。

我认为3号也很好,因为你会得到你需要的信息。 切勿使用选项1.

顺便说一句,只是一个独特的见解,他说,坏事发生在一个错误行是有点多余;)

1

如果你看的Throwable的源代码(HTTP ://www.docjar.com/html/api/java/lang/Throwable.java.html),你会发现Throwable当被要求打印它的堆栈跟踪时,会自动打印它的信息。

我觉得不太可能有人会更改此行为,所以你的论点是正确的和3选项是好的

1

你一定要堆栈跟踪。 在您做过类似“错误:无法找到ID为{0}的客户”的情况下,消息很方便,这可能不在堆栈跟踪中。微不足道的例子,但你明白我的意思。

另一个消息是,如果你做日志为说csv,所以你可以分析它。您可以标准化消息,并使过滤更容易。

最后但并非最不重要的错误日志中的多余信息,方式方式不是一个问题,那么你不需要在它的信息。严格冗长的一面是我的指导原则。

哦,这是为了控制访问日志文件,从来没有说过把堆栈跟踪作为一个响应在asp例如。黑客湿了梦想。