Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用Lambda表达式参数化的Vert.x log语句_Java_Logging_Lambda_Vert.x - Fatal编程技术网

Java 用Lambda表达式参数化的Vert.x log语句

Java 用Lambda表达式参数化的Vert.x log语句,java,logging,lambda,vert.x,Java,Logging,Lambda,Vert.x,我想在一个基于Vert.x的项目中添加一些额外的调试信息,该项目恰好使用io.vertx.core.logging.Logger进行日志记录 据我所知,这个类没有提供一个签名与函数接口匹配的方法 我想要输出的日志消息可以基于相当大的值集合。我希望避免不必要地改变它 这似乎给我留下了以下模式: if (LOGGER.isDebugEnabled()) { LOGGER.debug(buildMyLargeCollectionsStringRepresentation()); } 另一方面

我想在一个基于Vert.x的项目中添加一些额外的调试信息,该项目恰好使用
io.vertx.core.logging.Logger
进行日志记录

据我所知,这个类没有提供一个签名与函数接口匹配的方法

我想要输出的日志消息可以基于相当大的值集合。我希望避免不必要地改变它

这似乎给我留下了以下模式:

if (LOGGER.isDebugEnabled()) {
    LOGGER.debug(buildMyLargeCollectionsStringRepresentation());
}
另一方面,这使我的代码一次又一次地检查
isDebugEnabled()

为了简洁和潜在的优化,我宁愿让框架来决定


有没有一种方法可以用类似的方式使用供应商?

它看起来不像。但是,只要稍加注意,您可能不需要像
isDebugEnabled()
这样的保护函数。记录器通常在格式化字符串之前检查日志函数内部的日志级别。如果确定日志记录级别匹配,它将进行字符串格式化,包括对传入的任何参数调用
toString()
,以包含在格式化字符串中。如果避免将复杂表达式直接传递到记录器方法中,而是将表达式封装在对象中,该对象的
toString()
函数会计算要记录的表达式,那么您可能不必使用保护表达式,就可以获得保护表达式的好处

我不确定vertx是如何将其API绑定到JUL日志的。第一个对象参数可能会在7月份作为供应商参数传递。如果不是,您可以尝试下面的技术,该技术可以适用于对其参数调用toString()的任何常规字符串日志记录机制

考虑以下使用slf4j参数表示法的情况:

debug("Doing something with {}", some_expression_that_is_expensive);
在本例中,无论是否启用调试日志记录,每次调用
debug
函数时都会调用一些开销很大的
表达式。如果你有一门课,比如

class EncapsulatedExpression {
    @Override
    public String toString() {
        return some_expression_that_is_expensive;
    }
}
然后你可以打电话

debug("Doing something with {}", new EncapsulatedExpression());
然后,
只有在日志级别为debug时才会调用一些昂贵的表达式

你说的没错,
供应商
将以更一般的方式提供类似的延迟评估,因此为了得到你想要的东西,你需要一个工具来创建一些东西来封装
供应商
,其
toString()
将导致对供应商进行评估。也许这样的方法会奏效:

class ToStringSupplier<T> {
    private Supplier<T> supplier;

    public ToStringSupplier(Supplier<T> supplier){
        this.supplier = supplier;
    }

    public static <T> ToStringSupplier<T> lazily(Supplier<T> supplier){
        return new ToStringSupplier<>(supplier);
    }

    @Override
    public String toString(){
        return Objects.toString(supplier.get());  // supplier could safely return null
    }
}
debug("Doing something with {}", lazily(() -> some_expression_that_is_expensive));