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():”;“我正在寻求一条线解决方案”>为什么?