Java 用Lambda表达式参数化的Vert.x log语句
我想在一个基于Vert.x的项目中添加一些额外的调试信息,该项目恰好使用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()); } 另一方面
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));