当你做类似的事情时LOG.debug("Exported {}.", product)
在 slf4j 中,它最终会在参数上调用 toString(),例如product
.
由于某些原因,我无法在要用作参数的所有类上重写 toString() 。有些类来自第三方 jar,其他类也会在其他上下文中调用它们的 toString(),而我想要在日志语句中打印的信息不可用。
但是,我有一个用于调试目的的类,它有一个方法DebugFormatter.format(Object)
它有一个很长的实例级联,它选择例程来查找有关该对象的一些有用的调试信息。
我的问题是:是否可以配置 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));
这确实比直接传递对象的开销稍大,但这是一个很小的、恒定的开销——并且创建的对象将非常短暂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)