14

看来slf4j的方法只接受字符串参数,使用它的方法时是否必须将所有内容都转换为字符串?

4

3 回答 3

13

消息类型需要 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,那么 yourObject 将对所有的 appender 都可用。其他日志框架不支持消息参数,因此 SLF4J 必须在调用底层框架之前格式化消息。

于 2011-03-29T08:40:17.480 回答
2

看来slf4j的方法只接受字符串参数,使用它的方法时是否必须将所有内容都转换为字符串?

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

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

  • 试图迎合底层的日志框架行为,
  • 尽量减少对性能的影响,以及
  • “实施者的特权”。

(最后一个原则是,如果某个东西是由一个不向某个设计委员会负责的人设计/实施的,那么他对风格等的看法比其他任何人都更重要。)

于 2011-03-29T00:10:43.217 回答
0

尝试

String.valueOf(yourObject)

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

于 2011-03-28T23:21:20.003 回答