不带toString()的slf4j [英] slf4j without toString()
本文介绍了不带toString()的slf4j的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当您在slf4j中执行类似LOG.debug("Exported {}.", product)
的操作时,它最终将对参数调用toString(),例如product
。
由于某些原因,我不能在所有要用作参数的类上重写toString()。一些类来自第三方JAR,其他类也将在其他上下文中调用其toString(),在这些上下文中,我要在日志语句中打印的信息不可用。
但是,我有一个用于调试目的的类,它有一个方法DebugFormatter.format(Object)
,它有一个很长的instanceofs级联,它选择例程来查找有关该对象的一些有用的调试信息。
我的问题是:是否可以配置slf4j,使其调用这样的静态方法而不是toString()?
当然,在将对象作为参数传递给Logger.debug()
之前,我可以在对象上调用我的Format方法,但随后即使没有启用相应的记录器,它也会被执行。因此,我不得不用if (LOG.isDebugEnabled())
将其括起来,这意味着忽略了在DEBUG()中使用参数的全部意义。
推荐答案
您可以创建填充程序,获取对象并从其toString()
函数调用DebugFormatter.format()
。大概是这样的:
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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文