不带toString()的slf4j [英] slf4j without toString()

查看:17
本文介绍了不带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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆