Logger vs. System.out.println

2022-08-31 20:17:32

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

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

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


答案 1

请参阅 log4j 的简短介绍

问题出在 用于打印调试或诊断信息。这是一种不好的做法,因为您无法轻松更改日志级别,将其关闭,自定义等。System.out

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


答案 2

如果您使用 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()方法之外,使用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。


推荐