Java 即使日志级别不为';我不允许他们

Java 即使日志级别不为';我不允许他们,java,logging,Java,Logging,如果我有一个java util日志语句,比如 logger.log(LEVEL.FINE, "data buffer = {0}", CommonUtils.prepareDataBufferString(dataBuffer)); 现在,即使我的日志级别不是很好,昂贵的准备。。方法仍然被调用, 这不是我想要的。最后,我在执行此语句之前检查记录器级别 if(logger.isLoggable(LEVEL.FINE)){ bufferString = CommonUtils.prepar

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

logger.log(LEVEL.FINE, "data buffer = {0}", 
CommonUtils.prepareDataBufferString(dataBuffer));
现在,即使我的日志级别不是很好,昂贵的准备。。方法仍然被调用, 这不是我想要的。最后,我在执行此语句之前检查记录器级别

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

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

这不必要地增加了代码行数。我可以不必这样做吗。请帮忙

不,我所知道的任何Java日志API都无法避免它。语言中只有两种方法可以实现您的目标:

  • 您描述的if语句
  • 将实现接口的对象传递到API以生成详细信息

  • 我知道没有实现(2)的日志API,而且我不确定您是否会发现传入匿名对象不会太冗长。

    类似的技术可能会有所帮助

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

    仅供参考,调用该方法的不是日志框架,而是Java。Java要求在调用方法之前对方法的所有参数进行求值(这称为急切求值,与惰性求值不同)。

    使用参数化形式的
    log
    ?(例如Logger.log(level,message,param)FYI如果您使用
    if
    语句,为什么不在下面的块中直接调用记录器,而不是在条件为false的情况下必须初始化的范围更广的额外变量?