即使日志级别不允许,java util logging也会调用方法

时间:2012-11-16 23:04:06

标签: java logging

如果我有一个java util日志语句,如

logger.log(LEVEL.FINE, "data buffer = {0}", 
CommonUtils.prepareDataBufferString(dataBuffer));

现在即使我的日志级别不是FINE,仍然会调用昂贵的prepare ..方法, 这不是我想要发生的事情。我最终在此声明之前检查了记录器级别

if(logger.isLoggable(LEVEL.FINE)){
   bufferString = CommonUtils.prepareDataBufferString(dataBuffer);
}

logger.log(LEVEL.FINE, "data buffer = {0}", bufferString);

这会不必要地增加代码行数。我可以避免以某种方式这样做。请帮忙。

2 个答案:

答案 0 :(得分:4)

这样的技术可能有所帮助。

logger.log(LEVEL.FINE, "data buffer = {0}", 
    new Object() {
        @Override public String toString() {
            return CommonUtils.prepareDataBufferString(dataBuffer));
        }
    });

仅供参考,它不是调用方法的日志框架,而是Java。 Java要求在调用方法之前评估方法的所有参数(这称为急切评估,与惰性评估形成对比)。

答案 1 :(得分:2)

不,你不能用我知道的任何Java日志API来避免它。语言中只有两种方法可以满足您的需求:

  1. 您描述的if语句
  2. 将实现接口的对象传递给API以生成详细信息。
  3. 我知道没有记录API实现(2),而且我不确定你发现传递一个匿名对象的冗长程度。