我什么时候应该使用error.printStrackTrace()而不是log4.j.error()

时间:2012-05-10 14:12:27

标签: java logging log4j

何时应该使用Throwable.printStackTrace()而不是使用log4j方法error(String, Throwable)打印错误?

差异在哪里,常见用途是什么?

//欢呼

4 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

  

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

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

  

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

最常见的用途是通过记录器,除非在生产中你根本不记录任何东西。

答案 2 :(得分:1)

如果您正在记录,则使用Log4J方法。您可以在处理>,以便在文件/控制台/中显示/读取日志...您可以选择调试级别来显示/隐藏某些信息

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

此外,通过Log4J,您可以轻松地“简化”消息并让用户/开发人员了解最新情况。

编辑: 您可能想看一下SLF4J,它可以让您轻松更改Logging后端(在您的情况下为LOG4J)。

答案 3 :(得分:1)

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

  • 无法使用日志记录(由于某种原因)时,
  • 当您总是用户看到堆栈跟踪的内容(由于某种原因),或
  • 在进行调试时,需要快速而脏的堆栈跟踪。
  

差异在哪里,常见用途是什么?

基本上,差异在于更高的水平。使用日志记录框架进行日志记录或使用System.err.println语句进行日志记录是不同的。

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

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

不可否认,微小的应用程序可能并不需要所有这些,但如果您的应用程序需要完全执行日志记录,那么使用日志记录框架可以免费提供开发或性能最小的开销。