3

我在用着java.util.logging

我有一个 foo 函数:

public String foo() {
    System.out.println("syso ==> foo");
    return "foo";
}

当我更改日志级别时,我不希望 foo 被执行!

Logger logger = Logger.getLogger(MyClass.class.getSimpleName());
FileHandler fileHandler = new FileHandler("myapp.log");
logger.addHandler(fileHandler);
logger.setLevel(Level.SEVERE);
logger.info("Write foo: " + foo() );
logger.severe("Test severe");

我知道logger.info()不会打印在日志文件中,但是为什么要执行foo()呢?我该如何解决?

谢谢

4

4 回答 4

1

虽然它不显示该文本,但该行确实被执行,因为该行不是注释。

如果使用 Apache Logger,请尝试以Logger.isInfoEnabled()这种方式使用方法:-

if(logger.isInfoEnabled()){
    logger.info("Write foo: " + foo() );
}

否则,如果它的 jdk 记录器,则使用@n1ckolas建议的以下方法

if (logger.isLoggable(Level.INFO)) {
    logger.info("Write foo: " + foo() );
}
于 2013-02-27T10:08:47.563 回答
1

Logger.info期待一个String论点。

"Write foo: " + foo()正在转换为String,甚至在info方法内检查日志记录级别之前。

在这个过程中foo()被执行以获得String它返回。

要解决这个问题,您可以使用以下构造:

if (logger.isLoggable(Level.INFO)) {
    logger.info("Write foo: " + foo());
}
于 2013-02-27T10:09:07.010 回答
1

看起来你正在使用这些java.util.logging.*课程。那么这应该可以解决问题:

if (logger.isLoggable(Level.INFO)) {
    logger.info("Write foo: " + foo() );
}

如果您使用的是 Log4J,请使用

if (logger.isInfoEnabled()) {
    logger.info("Write foo: " + foo() );
}
于 2013-02-27T10:12:30.543 回答
1

您禁用 info 的事实不会使logger.info编译器和链接器“不可见”该行。该行仍将执行,并且由于您对其进行了调用,foo因此也将执行该行。

您应该使用 Logger 方法检查是否启用了信息级别,并且仅使用log.info

如果您使用的是 apache 记录器而不是使用:

if (logger.isInfoEnabled()) {
    logger.info("Write foo: " + foo() );
}
于 2013-02-27T10:06:59.780 回答