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

2022-09-03 07:01:07

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


答案 1

消息类型需要 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,则您的对象将原封不动地提供给所有追加器。其他日志记录框架不支持消息参数,因此 SLF4J 必须在调用底层框架之前格式化消息。


答案 2

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

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

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

  • 试图迎合底层的日志记录框架行为,
  • 尝试将性能影响降至最低,以及
  • “实施者的特权”。

(最后一个原则是,如果一个人不回答某个设计委员会,那么他对风格等的看法比其他任何人都更有分量。


推荐