记录好的做法

时间:2012-03-27 10:40:42

标签: java logging

我使用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);

    这是我通常使用的语法 - 但我想确保我没有遗漏任何内容。

3 个答案:

答案 0 :(得分:2)

我通常使用数字2,虽然我永远不会将一行日志分成2行(\ n),但是当打印堆栈跟踪时,它并不重要(在所有其他情况下,它会产生太多的视觉熵)当你的日志变得非常庞大时。)

为什么我使用2号?

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

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

我认为3号也没关系,因为无论如何你都会得到你需要的信息。 切勿使用选项1。

顺便说一下,只是一个特定的意见,说ERROR线上发生的事情有点多余;)

答案 1 :(得分:1)

如果你看一下Throwable的源代码(http://www.docjar.com/html/api/java/lang/Throwable.java.html),当你被要求打印它的堆栈跟踪时你会发现它是Throwable从打开它自己开始,打印它的消息。

我发现任何人都不太可能改变这种行为,所以你的论证都是正确的,而且3.选项很好

答案 2 :(得分:1)

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

另一个消息是,如果你像csv那样执行日志,那么你可以分析它。您可以标准化消息,并使过滤更容易。

错误日志中的最后但并非最不重要的信息是方式,而不是问题,然后您不需要在其中的信息。极端冗长的一面是我的指导原则。

哦,这是对受控制的日志文件的访问,从来没有说过将堆栈跟踪作为例如asp中的响应。黑客梦见了。