gpt4 book ai didi

没有 toString() 的 slf4j

转载 作者:行者123 更新时间:2023-12-04 03:01:48 25 4
gpt4 key购买 nike

当你做类似 LOG.debug("Exported {}.", product) 的事情时在 slf4j 中,它最终会在参数上调用 toString(),例如product .

出于某些原因,我无法在我想用作参数的所有类上覆盖 toString()。一些类来自第三方 jar,其他类也会在其他上下文中调用它们的 toString(),在我想在日志语句中打印的信息不可用的情况下。

但是,我有一个用于调试目的的类,它有一个方法 DebugFormatter.format(Object)它有很长的 instanceofs 级联,它选择例程来查找有关该对象的一些有用的调试信息。

我的问题是:是否可以配置 slf4j 以便它调用这样的静态方法而不是 toString()?

当然,在将对象作为参数传递给 Logger.debug() 之前,我可以在对象上调用我的格式方法。但是即使未启用相应的记录器,它也会执行。所以我不得不用 if (LOG.isDebugEnabled()) 包围它这意味着错过了在 debug() 中使用参数的全部意义。

最佳答案

你可以创建一个垫片,拿起你的对象并调用 DebugFormatter.format()来自其 toString()功能。像这样的东西:

class DebugFormatObject {
private final Object o;

public static DebugFormatObject forDebug(Object o) {
return new DebugFormatObject(o);
}

private DebugFormatObject(Object o) {
this.o = o;
}

@Override
public String toString() {
return DebugFormatter.format(o);
}
}

通过适当的静态导入,您的日志记录语句变为:
LOG.debug("Exported {}.", forDebug(product));

这确实比直接传递对象有更多的开销,但它是一个小的、恒定的开销——并且创建的对象将非常短暂。

关于没有 toString() 的 slf4j,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com