2

我什么时候应该打印错误Throwable.printStackTrace()而不是使用 log4j 方法error(String, Throwable)

区别在哪里,共同用途是什么?

//欢呼

4

4 回答 4

4

Throwable.printStackTrace()将您的堆栈跟踪打印到标准错误,而 log4j 方法将在您喜欢的位置打印它。您可以通过log4j 配置文件指定何时以及如何打印堆栈跟踪。

第二种方法是最好的方法,因为您始终可以决定将错误写入标准错误,同时也可以将其打印到滚动文件中。您的缺点是您需要在项目中使用 log4j 依赖项,但也有使用 log4j 的解决方案而不声明此依赖项并仅在运行时提供它。

编辑:一个常见的用途是使用 log4j api 在代码中写入日志,并在部署应用程序的位置配置 log4j。另一种方法是使用 java.util.logging 编写它们以避免任何直接依赖,您可以使用slf4j桥从您和第 3 方代码中捕获任何日志并将其传递到您喜欢的日志记录 API(即 log4j)

于 2012-05-10T14:22:33.983 回答
2

通常你不会这样做,因为它会将错误打印到标准错误输出。如果您不保留此消息(文件或数据库),则关闭控制台后它就会消失。

将此 throwable 及其回溯打印到标准错误流。

相反,您想要的是通过Logger.error(String, Throwable)记录到文件中,并且您可以在调试生产问题时找到该日志文件。除此之外,使用 log4j,您可以根据不同的环境配置日志级别以显示在日志中,例如,在生产中,您可能只记录级别信息、警告和错误级别,而在开发过程中,您也记录调试语句.

使用 ERROR 级别记录一个消息对象,包括作为参数传递的 Throwable t 的堆栈跟踪。

最常见的用途是通过记录器进行,除非在生产中您根本不记录任何内容。

于 2012-05-10T14:22:52.780 回答
1

如果您正在记录,请使用 Log4J 方法。您将掌握在何处以及是否希望在文件/控制台/中显示/读取日志...您可以选择调试级别以显示/隐藏某些信息

Throwable.printStackTrace 只会将堆栈跟踪发送到标准错误流。

此外,使用 Log4J,您可以轻松“简化”消息并让用户/开发人员知道发生了什么。

编辑:您可能想看看 SLF4J,它可以让您非常轻松地更改日志记录后端(在您的情况下为 LOG4J)。

于 2012-05-10T14:22:15.057 回答
1

Throwable.printStackTrace()您优先使用日志记录的唯一情况是:

  • 当您不能使用日志记录时(出于某种原因),
  • 当您总是让用户看到堆栈跟踪时(出于某种原因),或者
  • 当您在调试时,需要快速而肮脏的堆栈跟踪。

区别在哪里,共同用途是什么?

基本上,差异在更高的水平。System.err.println这是使用日志框架进行日志记录或使用语句进行日志记录之间的区别。

前者有许多优点,您会在各种日志框架的文档和 javadocs 中找到很好的描述。主要的有:

  • 简单的细粒度伐木控制;例如级别、类别等,
  • 许多用于记录和格式化日志信息的选项,以及
  • 使用配置文件的广泛的开箱即用可配置性。

诚然,小型应用程序可能不需要所有这些,但如果您的应用程序需要进行日志记录,那么使用日志记录框架可以免费为您提供这些,而开发或性能开销最小。

于 2012-05-10T14:24:56.587 回答