2

如果我有一个 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);

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

4

2 回答 2

4

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

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

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

于 2012-11-16T23:12:37.857 回答
2

不,您无法使用我知道的任何 Java 日志记录 API 来避免它。语言中实际上只有两种方法可以做你想做的事:

  1. 您描述的 if 语句
  2. 将实现接口的对象传递给 API 以生成详细信息。

我知道没有任何日志记录 API 实现 (2),而且我不确定您是否会发现传入匿名对象不那么冗长。

于 2012-11-16T23:07:22.797 回答