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


Answers:


137

这意味着您应该使用类似 要么 而不是直接打印异常:

e.printStackTrace();

您应该使用以下框架的API记录它们:

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

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


39

如果调用printStackTrace()异常,则会将跟踪写入到其中System.err,并且很难将其路由到其他位置(或对其进行过滤)。建议您不要使用日志记录框架(或围绕多个日志记录框架的包装器,例如Apache Commons Logging),并建议使用该框架记录异常(例如logger.error("some exception message", e))。

这样做可以使您:

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

17

生产质量程序应使用许多日志记录替代方法(例如log4j,logback,java.util.logging)之一来报告错误和其他诊断信息。这具有许多优点:

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

相比之下,如果仅使用printStackTrace,则部署者/最终用户几乎没有控制权,并且在不适当的情况下,日志消息很容易丢失或显示给最终用户。(没有什么比随机堆栈跟踪更让胆小的用户感到恐惧了。)


5

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


0

几乎每个日志记录框架都提供了一种方法,我们可以在其中传递可抛出对象以及消息。喜欢:

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

它们打印可抛出对象的堆栈跟踪。


这不能回答问题。
Stephen C

-1

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


-3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.