什么';在Java中使用System.err有什么不对?
我正在Java代码上使用Enerjy()静态代码分析器工具。它告诉我以下几行: System.err.println(“忽略该数据库”) 错误,因为它使用System.err。确切的错误是:“JAVA0267使用System.err”什么';在Java中使用System.err有什么不对?,java,static-analysis,stderr,Java,Static Analysis,Stderr,我正在Java代码上使用Enerjy()静态代码分析器工具。它告诉我以下几行: System.err.println(“忽略该数据库”) 错误,因为它使用System.err。确切的错误是:“JAVA0267使用System.err” 使用System.err有什么问题?简短回答:将其用于日志记录目的被认为是一种不好的做法 据观察,在没有广泛可用/接受的日志框架的旧时代,每个人都使用System.err打印错误消息并将跟踪堆栈到控制台。这种方法在开发和本地测试阶段可能是合适的,但不适合于生产环境
使用System.err有什么问题?简短回答:将其用于日志记录目的被认为是一种不好的做法 据观察,在没有广泛可用/接受的日志框架的旧时代,每个人都使用System.err打印错误消息并将跟踪堆栈到控制台。这种方法在开发和本地测试阶段可能是合适的,但不适合于生产环境,因为您可能会丢失重要的错误消息。因此,在今天几乎所有的静态分析工具中,这类代码都被检测到并标记为不良行为(或类似命名的问题) 日志框架反过来提供了结构化和逻辑的方式来记录事件和错误消息,因为它们可以将消息存储在各种持久位置(日志文件、日志数据库等) 最明显(并且没有外部依赖)的黑客解决方案是通过
Java.util.Logging.Logger
类使用内置Java日志框架,因为默认情况下它将日志事件转发到控制台。例如:
final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);
(或者您可以关闭该分析选项)System.err实际上更适合调试。最好以更加用户友好的方式正确处理异常和处理错误。如果用户希望看到错误,请改用System.out.println
如果您想从开发人员的角度跟踪这些错误,您应该使用记录器。错误的描述是: System.err的使用可能表示剩余的调试代码或样板代码。考虑使用 功能齐全的日志记录包,如Apache Commons,用于处理错误日志记录 您似乎正在使用System.err进行日志记录,但由于以下几个原因,这是次优的:
- 如果不修改应用程序二进制文件,则无法在运行时启用日志记录
- 无法通过编辑配置文件来控制日志记录行为
- 可能还有很多其他的
对于非控制台应用程序,System.err和System.out只有在其IDE中运行代码的开发人员才能看到,如果在生产中触发该项,则有用的信息可能会丢失。虽然我同意上述关于使用日志框架的观点,我仍然倾向于在一个地方使用
System.err
输出:在关闭挂钩中。这是因为我发现,当使用java.util.logging
framework日志语句时,如果它们出现在关闭挂钩中,则并不总是显示它们。这是因为日志库可能包含自己的shutdown hook来清理日志文件和其他资源,并且由于不能依赖shutdown hook的运行顺序,因此不能依赖java.util.logging
语句按预期工作
请查看此链接(“评论”部分)以了解更多信息
(显然,另一种选择是使用不同的日志框架。)System.err.println和System.out.println不应用作日志记录接口。STD输出和STD错误(由System.out和.err写入)用于来自命令行工具的消息。System.err打印到控制台。这可能适用于学生测试他们的家庭作业,但不适用于看不到这些消息的应用程序(控制台仅存储这么多行)
更好的方法是抛出一个异常,该异常包含通常会发送到控制台的消息。另一种方法是使用第三方日志软件,该软件将这些消息存储在一个可以永久存储的文件中。+1很高兴知道,谢谢。不过,我宁愿在我的应用程序中避免关机挂钩。此外,System.err不包括消息来源的信息。因此,您需要依靠人工读者来决定应该做什么。@kd304“因为您可能会丢失重要的错误消息”为什么?有没有去控制台?我遗漏了什么?@kd304你所说的“(或者你可以关闭分析选项)”是什么意思?@kd304,极客有一个有效的问题。。。为什么你说我们可能会丢失有关
System.err
的重要错误消息?“写入System.err的内容通常会在运行时丢失”--如何?@Geek,因为应用程序关闭时控制台会消失,或者根本看不见。