logging器与System.out.println

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

系统。(out | err).print被使用,请考虑使用logging器。

我的问题是 – 什么是logging器? 它如何用于打印到屏幕? 为什么更好?

看到这个简短的介绍log4j 。

问题在于使用System.out打印debugging或诊断信息。 这是一个不好的做法,因为您不能轻易更改日志级别,closures它,自定义等等。

但是,如果您合法使用System.out将信息打印到用户,则可以忽略此警告。

如果您正在使用System.out | err.println(..)在应用程序的main()方法中打印控制台上的用户信息,则不会出现任何错误。 您可以通过插入注释“// NOPMD”来消除该消息。

 System.out.println("Fair use of System.out.println(..).");// NOPMD 

为此目的,PMD违规提纲中有一个“经审查的标记”。

当然你可以用下面的代码片断来欺骗PMD:

 PrintStream out=System.out; out.println("I am fooling PMD."); 

在你的main()之外 – 方法使用像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。 我喜欢这个,因为从我的angular度来看,System.out.println在main(String args [])方法中是安全的。 但谨慎使用,我必须检查,AST中的哪里也可能发生System.out.println,并且必须修改XPath。

此链接提供了有关如何使用Log4j的更简洁的信息: 不要使用System.out.println! 但它只有一个小小的缺陷,你不应该把库放在/jre/lib/ext ,而只是放在应用程序的运行时类path中,然后发送。

其优点是可以使用日志logging级别来指示信息的重要性,以便您可以在外部configuration要在输出中显示/隐藏的级别(以免受到以后所有无用信息的干扰) ,如何输出应该看起来像(如包括一个时间戳,线程ID,类名,方法名等)和输出应写入(例如控制台,文件,电子邮件等),以及例如文件还应该如何创build它们(例如按年,月和/或日分组)。

Java SE的内置java.util.logging.Logger ,简便的Apache Commons Logging ,stream行的Apache Log4j ,其后继Logback等有几种logging器实现方式。您可以使用Slf4j作为额外的抽象层来在其中任何一种logging器,只要需要。

看来,PMD假设你正在调用System.out.println()进行debugging。 像“我在你的方法,执行你的代码”的东西。

如果你这样做,你将有更好的时间写入Log4J这样的logging器,因为它有多个stream选项,而不仅仅是屏幕。

但是,如果您正在执行控制台应用程序并将System.out作为其中的一部分调用,则请忽略该警告。

logging仪有多个logging级别。

如果我们正在编写一个真正的短程序,仅仅为了学习的目的, System.out.println是好的,但是当我们开发一个高质量的软件项目时,我们应该使用专业的logging器,并且应该避免SOP。

专业的logging仪提供不同的logging和灵活性水平。 我们可以相应地获取日志消息。 例如,X组消息应该只在PRODUCTION上打印,Y组消息应该在ERROR上打印等等。

我们在System.outredirect消息的选项有限,但是在logging器的情况下,您可以使用appender来提供多个选项。 我们甚至可以创build一个自定义输出选项并将其redirect到该选项。

System.out.println不好用,因为它不能configuration。 相反, Logger可以被configuration为login各个级别。 它有很多其他function。