Logger与System.out.println

时间:2010-05-01 14:44:43

标签: java eclipse pmd java.util.logging

我正在使用PMD插件进行eclipse,并且在使用System.out.println()时给出了错误说明:

  

使用系统。(out | err).print,考虑使用记录器。

我的问题是 - 什么是记录器?它是如何用于打印到屏幕的?为什么会更好?

6 个答案:

答案 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可以配置为登录各种级别。它有很多其他功能。