当级别严重时,Java日志记录不会执行信息

时间:2013-02-27 10:04:05

标签: java logging

我正在使用java.util.logging

我有一个foo函数:

public String foo() {
    System.out.println("syso ==> foo");
    return "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 个答案:

答案 0 :(得分:1)

禁用info的事实不会使编译器和链接器的logger.info行“不可见”。这一行仍然会执行,因为你打电话给foo,它也会被执行。

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

如果您使用的是apache记录器,请使用:

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

答案 1 :(得分: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() );
}

答案 2 :(得分:1)

Logger.info需要String参数。

即使在"Write foo: " + foo()方法中检查日志记录级别之前,

String也会转换为info

在此过程中foo()执行以获取它返回的String

要解决此问题,您可以使用此构造:

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

答案 3 :(得分:1)

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

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

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

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