2013-10-29 53 views
0

当我运行我的PMD插件时,他们说使用了System.out.println。为什么System.out.println不好用,是使用PMD插件时的缺陷吗?还有什么可以替代这种方式呢?为什么System.out.println不好?

+0

的[记录器对的System.out.println(http://stackoverflow.com/questions/2750346/logger-vs-system-out-println) – jontro

+4

可能重复它是如何一个缺陷?你需要更具体一点。 –

+0

这是一个缺陷,因为您启用了一个检查'System.out.println()'的规则。您可以使用以下页面中介绍的方法在您认为需要输出的地方抑制警告:http://pmd.sourceforge.net/pmd-5.0.5/suppressing.html。 –

回答

4

的System.out.println ..

通常用于调试的目的,甚至可以在生产代码留在 代码库。通过使用记录器,可以根据意愿(和优先级)启用/禁用此行为,并避免 堵塞标准输出日志。

(从SourceMeter Java user guide下 “Java记录规则”)

导入需要(的.jar)

Logger site

实施例:

import org.apache.log4j.Logger; 

class Foo{ 
    private static final Logger LOG = Logger.getLogger(Foo.class); 
    public void testA() { 
     System.out.println("Entering test"); 
     // Better use this 
     LOG.info("Entering test"); 
    } 
} 
+14

哇,你问一个问题,几秒钟后回答它?好 – Admit

+3

为什么你在接受答案时为问题开了一个赏金?令人惊讶! –

+0

使用if(LOG.isInfoEnabled()){...}包装LOG.info(“xyz”)行,以便如果未启用信息日志记录级别,则不会处理在LOG.info调用中构建/附加的任何字符串。 – Jason

6

使用配置可以开启/关闭记录器,但不能使用System.out.println。重要的是,记录器提供不同级别的记录,并且可以通过配置文件再次进行控制。

此外使用记录器,您可以配置旋转,清除等,但不能对sysout执行相同的操作。这在生产环境中尤其有用,执行大量代码并生成大量日志记录。

+0

CLI应用程序怎么样?通常输出到标准输出。这是这些类型的应用程序的正常输出。 –

+0

@TulainsCórdova在CLI应用程序中,您可以使用宏或简单的if/else来决定日志或不根据运行时参数进行日志记录 –

+0

我的意思是,如果System.out.println()被取消,那么意味着什么CLI应用程序写入屏幕? –

1

由于无法打开/关闭,设置输出级别(TRACE,DEBUG,INFO,WARN,ERROR)等,而无需重新编译代码,System.out被认为是日志记录的不良做法。另一个缺点是,一个程序的标准输出可以重定向,例如,如果你做到这一点并不总是很清楚,其中输出实际上是去,例如:

java SomeClass > someFile 

在这种情况下使用的日志记录API将帮助你。

但也有,你真的要打印的东西到标准输出也为这些场合有java.io.Console,它不能被重定向的情况,因此,如果你正在运行一个命令行Java程序,它让你确信用户正在看到打算给他们的信息。

+0

CLI应用程序的正常输出如何?这些应用程序通常写入标准输出,这不被视为日志记录。 –

+0

为此,请使用System.console(),因为它允许您确定是否在终端中,以及它更适合用户使用。 – chaos

+0

在Eclipse中我运行了''''''''''''''''''''' Doc说:“如果没有控制台设备可用,那么对该方法的调用将返回空值。”_ –

0

印刷过量的成到System.out可以从为PrintStream成为性能瓶颈,因为它是同步的,代码:

public void println(float x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 
1

这是因为,PMD定义了名为SystemPrintln一个java日志记录规则,其检测在System.out.println代码并将其视为缺陷。

由于:PMD 2.1

系统(出|错误).PRINT时,可以考虑使用的记录器。

此规则由下面的XPath表达式定义:

//Name[ 
    starts-with(@Image, 'System.out.print') 
    or 
    starts-with(@Image, 'System.err.print') 
    ] 

,你应该能够修改上面的XPath表达式重写的行为(我不知道虽然) 下面的链接应该给你更多的了解,

http://pmd.sourceforge.net/pmd-4.2.6/rules/logging-java.html

相关问题