避免使用printStackTrace();请使用记录器调用

时间:2012-05-07 06:23:57

标签: java logging pmd printstacktrace

在我的应用程序中,我正在通过PMD运行我的代码。它向我显示了这条消息:

  
      
  • 避免使用printStackTrace();请使用记录器调用。
  •   

这是什么意思?

7 个答案:

答案 0 :(得分:106)

这意味着您应该使用等日志框架,而不是直接打印例外:

e.printStackTrace();

你应该使用这个框架的API来记录它们:

log.error("Ops!", e);

日志框架为您提供了很大的灵活性,例如:您可以选择是否要登录到控制台或文件 - 或者如果您发现某些消息在某些环境中不再相关,则可以跳过这些消息。

答案 1 :(得分:34)

如果您在异常时调用printStackTrace(),则会将跟踪写入System.err并且很难将其路由到其他地方(或过滤它)。而不是这样做,建议您使用日志框架(或围绕多个日志框架的包装器,如Apache Commons Logging),并使用该框架记录异常(例如logger.error("some exception message", e))。

这样做可以让你:

  • 一次将日志语句写入不同的位置,例如控制台和文件
  • 按严重性(错误,警告,信息,调试等)和来源(通常是包裹或类别)过滤日志语句
  • 对日志格式有一些影响而无需更改代码

答案 2 :(得分:16)

生产质量计划应使用众多日志备选方案之一(例如log4j,logback,java.util.logging)来报告错误和其他诊断。这有许多优点:

  • 日志消息转到可配置的位置。
  • 除非您将日志配置为他/她,否则最终用户不会看到这些消息。
  • 您可以使用不同的记录器和日志记录级别等来控制记录少量或多少日志记录。
  • 您可以使用不同的appender格式来控制日志记录的内容。
  • 您可以轻松地将日志记录输出插入更大的监视/日志记录框架。
  • 以上所有操作都可以在不更改代码的情况下完成;即通过编辑已部署的应用程序的日志配置文件。

相比之下,如果您只使用printStackTrace,则部署者/最终用户几乎没有控制权,并且在不适当的情况下,日志消息可能会丢失或显示给最终用户。 (并且没有什么比一个随机的堆栈跟踪更害怕胆小的用户。)

答案 3 :(得分:4)

在Simple中,e.printStackTrace()不是好习惯,因为它只是将堆栈跟踪打印到标准错误。因此,您无法真正控制此输出的位置。

答案 4 :(得分:1)

几乎每个日志框架都提供了一种方法,我们可以在其中传递throwable对象和消息。像:

public trace(Marker marker, String msg, Throwable t);

他们打印throwable对象的stacktrace。

答案 5 :(得分:0)

让我们从公司概念入手。日志为您提供了灵活的级别(请参见Difference between logger.info and logger.debug)。不同的人希望看到不同的级别,例如QA,开发人员,业务人员。但是e.printStackTrace()会打印出所有内容。同样,就像将调用该方法一样,该错误可能会打印多次。然后,您公司中的Devops或Tech-Ops人员可能会发疯,因为他们将收到相同的错误提示。 我认为更好的替代方法可能是log.error("errors happend in XXX", e) 与e.printStackTrace()

相比,这还将打印出易于阅读的全部信息。

答案 6 :(得分:-1)

主要原因是Proguard将从生产中删除Log调用。因为通过登录或打印StackTrace,可以通过例如Logcat Reader应用程序在Android手机中查看它们(堆栈跟踪或Log中的信息)。因此,这对于安全性而言是一种不良做法。另外,我们在生产期间不访问它们,最好将其从生产中删除。由于ProGuard会删除所有不是stackTrace的Log调用,因此最好使用Log in catch代码块,然后由Proguard将其从Production中删除。