我正在使用PMD插件进行eclipse,并且在使用System.out.println()
时给出了错误说明:
使用系统。(out | err).print,考虑使用记录器。
我的问题是 - 什么是记录器?它是如何用于打印到屏幕的?为什么会更好?
答案 0 :(得分:28)
请参阅this short introduction to log4j。
问题在于使用System.out
打印调试或诊断信息。这是一种不好的做法,因为您无法轻松更改日志级别,将其关闭,自定义等等。
但是,如果您合法地使用System.out
向用户打印信息,则可以忽略此警告。
答案 1 :(得分:11)
如果您正在使用System.out | err.println(..)在应用程序的main()方法中打印出控制台上的用户信息,那么您没有做错任何事。您可以通过插入注释“// NOPMD”来删除该消息。
System.out.println("Fair use of System.out.println(..).");// NOPMD
为此目的,在PMD-Violations Outline中有一个“Mark as review”选项。
当然,您可以使用以下代码段来欺骗PMD:
PrintStream out=System.out;
out.println("I am fooling PMD.");
在main()之外 - 方法使用Log-System,例如Log4j。
<强>更新强>
您还可以修改PMD规则“SystemPrintln”以使用以下XPath:
//MethodDeclaration[@MethodName!="main"]//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
] | //Initializer//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
]
这将在代码中名为“main”的任何方法中忽略System.out.println等,但在初始化代码中检查System.out.println。 我喜欢这个,因为从我的角度来看,System.out.println在方法'main(String args [])'中是安全的。但请谨慎使用,我必须检查,AST中的System.out.println也可以在哪里发生,并且必须调整XPath。
答案 2 :(得分:5)
此链接提供了有关如何使用Log4j的更简明信息:Don't use System.out.println!但是它只有一个小缺陷,您不应该将库放在/jre/lib/ext
中,而只是在您的运行时类路径中申请并运送它。
优点是您可以使用日志记录级别来指示信息的重要性,这样您就可以在外部配置要在输出中显示/隐藏的级别(这样您就不会被以下所有人所烦恼 - 无用的信息),输出应该是什么样的(例如包括时间戳,线程ID,类名,方法名等)以及应该将输出写入的位置(例如控制台,文件,电子邮件等)以及例如文件也应该如何创建(例如按年,月和/或日分组)。
有几个记录器实现,例如Java SE的内置java.util.logging.Logger
,方便的Apache Commons Logging,流行的Apache Log4j,其后继者Logback等。您可以使用{{ 3}}作为额外的抽象层,可以在需要时在任何记录器之间切换。
答案 3 :(得分:5)
记录器有多个级别用于记录。
如果我们正在编写一个真正的短程序,仅仅为了学习目的System.out.println
很好,但是当我们开发一个高质量的软件项目时,我们应该使用专业的记录器,并且应该避免使用SOP。
专业记录仪提供不同级别的记录和灵活性。我们可以相应地获取日志消息。例如,组X消息应仅在PRODUCTION上打印,组Y消息应打印在ERROR等上。
我们在System.out
中重定向消息的选项有限,但在记录器的情况下,您有提供多个选项的appender。我们甚至可以创建自定义输出选项并将其重定向到该选项。
答案 4 :(得分:4)
看来PMD假设您正在调用System.out.println()
进行调试;像“我在你的方法,执行你的代码”这样的东西。
如果您正在这样做,那么您将有更好的时间写入Log4J等记录器,因为它将拥有多个流媒体选项,而不仅仅是屏幕。
但是,如果您正在执行控制台应用程序并且正在调用System.out
作为其中一部分,请忽略该警告。
答案 5 :(得分:0)
System.out.println
不适合使用,因为无法配置。相反,Logger
可以配置为登录各种级别。它有很多其他功能。