有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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


共 (2) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

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

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

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