我正在使用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()
?
我该如何解决?
感谢的
答案 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() );
}