如何在slf4j中记录非字符串项

时间:2011-03-28 23:18:58

标签: java slf4j

似乎slf4j的方法只接受字符串参数,在使用其方法时是否必须将所有内容转换为字符串?

3 个答案:

答案 0 :(得分:7)

为消息类型要求String而不是Object的主要原因是为了避免方法签名中的歧义。

采取以下签名:

1) debug(Object) // a message
2) debug(Object, Object) // message followed by a parameter
3) debug(Object, Exception)  // message followed by an exception

然后,当你写

debug("hello", new Exception("world"));

目前尚不清楚是否应使用变体2或变体3。

在任何情况下,使用现有的SLF4J API,您始终可以写:

  logger.debug("{}", yourObject);

如果底层日志记录框架是logback,那么所有appender都可以使用yourObject。其他日志记录框架不支持消息参数,因此SLF4J必须在调用底层框架之前格式化消息。

答案 1 :(得分:2)

  

似乎slf4j的方法只接受字符串参数,在使用其方法时是否必须将所有内容转换为字符串?

如果你在谈论像Logger.debug(String message)这样的1参数方法,那么你做的就是。但是还有其他方法,例如Logger.debug(String format, Object[] args),不需要这样做。

我不确定为什么sl4fj的API是这样的(例如log4j的API不是),但它可能是以下的一些组合:

  • 试图满足底层日志框架行为,
  • 尝试将性能影响降至最低,
  • “实施者的特权”。

(最后一个原则是,如果一个人没有回答某个设计委员会的设计/实施某些事情,他对风格等的看法比其他任何人都重要。)

答案 2 :(得分:0)

尝试

String.valueOf(yourObject)

然后确保你的toString()方法实际上是有意义的