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.out
redirect消息的选项有限,但是在logging器的情况下,您可以使用appender来提供多个选项。 我们甚至可以创build一个自定义输出选项并将其redirect到该选项。
System.out.println
不好用,因为它不能configuration。 相反, Logger
可以被configuration为login各个级别。 它有很多其他function。