4

当我运行我的 PMD 插件时,他们说System.out.println已经使用了。为什么System.out.println使用不好?使用 PMD 插件时是否存在缺陷?克服这个问题的替代方法是什么?

4

5 回答 5

8

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

同样使用记录器,您可以配置轮换、清除等,但不能为 sysout 做同样的事情。这在生产环境中特别有用,执行大量代码并生成大量日志记录。

于 2013-10-29T11:07:11.357 回答
5

System.out.println()被认为是记录日志的不良做法。
因为

  • 没有能力转动它(ON/ OFF
  • 无需重新编译代码,无法设置输出级别 ( TRACE, DEBUG, INFO, WARN, ERROR)

另一个缺点是程序的标准输出可以被重定向,例如,并不总是清楚输出的实际去向,例如,如果你这样做:

java SomeClass > someFile

在这种情况下,使用日志记录 API 将对您有所帮助。

但是在某些情况下,您也确实想将某些内容打印到标准输出,对于那些java.io.Console无法重定向的情况,因此如果您正在运行命令行 java 程序,它会让您确信用户正在查看发给他们的消息。

于 2013-11-22T00:58:39.367 回答
4

System.out.println..

通常用于调试目的,即使在生产代码中也可以保留在代码库中。通过使用记录器,可以随意(并按优先级)启用/禁用此行为,并避免阻塞标准输出日志。

(来自“Java 日志记录规则”下的SourceMeter Java 用户指南)

需要导入 (.jar)

记录仪站点

例子:

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");
    }
} 
于 2013-10-29T11:01:07.050 回答
2

将过多的内容打印到 System.out 可能会成为性能瓶颈,因为它是同步的,来自 PrintStream 的代码:

public void println(float x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}
于 2013-11-25T19:04:58.050 回答
1

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

自:PMD 2.1

使用 System.(out|err).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

于 2013-11-26T19:03:37.637 回答