Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日志记录在严重级别时不执行info_Java_Logging - Fatal编程技术网

Java日志记录在严重级别时不执行info

Java日志记录在严重级别时不执行info,java,logging,Java,Logging,我正在使用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("mya

我正在使用
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()
? 我怎样才能解决它


谢天谢地,您禁用info并不会使编译器和链接器“看不见”logger.info行。这一行仍将执行,因为您调用了
foo
,所以它也将执行

您应该使用记录器方法检查信息级别是否已启用,并且仅限于使用
log.info

如果您使用的是apache logger,请使用:

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

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

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

if(logger.isInfoEnabled()){
    logger.info("Write foo: " + foo() );
}
否则,如果它是jdk记录器,则使用@n1ckolas建议的以下方法

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

Logger.info
需要一个
String
参数

“Write foo:“+foo()
正在转换为
字符串
,甚至在
info
方法中检查日志记录级别之前

在此过程中,执行
foo()
以获取它返回的
字符串

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

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

看起来您正在使用
java.util.logging.*
类。 那么这就应该起作用了:

if (logger.isLoggable(Level.INFO)) {
    logger.info("Write foo: " + foo() );
}
如果您使用的是Log4J,那么使用

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

他似乎在使用jdk1.4 Logger,因此它应该是
Logger.isLoggable(Level.INFO)
Finnaly,使用它的一个正当理由……)@可能是整流罩-我想知道OP是否发布了一个简单的示例,与实际需要的内容不符。因此,下面的方法可能更适合于实际用例。@DuncanJones可能,我认为这种方法更符合逻辑。在toString方法中放入任何函数代码都有点奇怪。这实际上应该只用于返回变量的字符串表示形式。(例如,假设方法foo()正在从数据库读取状态)。在toString()方法中没有意义如果您希望它在一行中,您可以将它提取到您自己的方法中。就我个人而言,我不认为这是必要的,除非你每行都使用它,但这会检查两次级别,看起来有点奇怪:logger.info(logger.isLoggable(level.info)?“Write foo:”+foo():”;“我正在寻求一条线解决方案”>为什么?