【问题标题】:Correct method of logging exceptions [closed]记录异常的正确方法[关闭]
【发布时间】:2014-11-12 10:11:59
【问题描述】:

在下面的代码中,异常记录使用

logger.error("error", exceptionType.getMessage);

&

logger.error("error", exceptionType);

使用logger.error("error", exceptionType); 记录异常消息和堆栈跟踪。我认为使用 logger.error("error", exceptionType); 是首选选项,因为它会记录堆栈跟踪。但是我遇到了两种方法。是否有理由使用logger.error("error", exceptionType.getMessage); 而不是logger.error("error", exceptionType);

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExceptionTest {

    public static void main(String args[]) {

        try {
            throwsException();
        } catch (Exception e) {
            System.out.println("1");
            logger.error("error", e.getMessage());
        }

        try {
            throwsException();
        } catch (Exception e) {
            System.out.println("2");
            logger.error("error", e);
        }
    }

    private static void throwsException() throws Exception {
        throw new Exception();
    }

    private static Logger logger = LoggerFactory.getLogger(ExceptionTest.class);

}

输出:

1
12.11.2014 10:06:30 ERROR [xceptionTest.main():14] error
2
12.11.2014 10:06:30 ERROR [ExceptionTest.main():21] error
java.lang.Exception
    at ExceptionTest.throwsException(ExceptionTest.java:26)
    at ExceptionTest.main(ExceptionTest.java:18)

【问题讨论】:

标签: java logging log4j slf4j


【解决方案1】:

当错误消息足够详细时,完整的堆栈跟踪可能会在日志中添加不必要的细节。例如,您实际上不需要查看 FileNotFoundException 的跟踪:记录文件名和错误消息足以知道哪个文件无法打开以及原因。

堆栈跟踪等多行消息在外部进程读取日志文件的系统中也可能存在问题。如果消息和日志行之间存在一对一的对应关系,那么日志解析器就会更容易编写。

【讨论】:

  • 在我参与的一个项目中,我们被告知(仅当堆栈跟踪可能有用时)将堆栈跟踪日志条目单独添加到更高级别(如“跟踪”)。因此,您只需将 Level 从 Debug 或 Info 设置为 Trace,即可在开发中打开跟踪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2019-11-17
  • 2020-06-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多