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

问题描述 投票:0回答:3

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

java slf4j
3个回答
16
投票

要求消息类型使用 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 必须在调用底层框架之前格式化消息。

2024 年更新: SLF4J 2.0 中引入的 Fluent API 允许通过

addArgument(Object)
addKeyValue(String, Object)
方法传递对象数据。


3
投票

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

如果您正在谈论像

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

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

  • 尝试满足底层日志框架行为,
  • 尽量减少性能影响,并且
  • “实施者的特权”。

(最后一个原则是,如果某件事是由一个不向某些设计委员会负责的人设计/实现的,那么他对风格等的意见比其他任何人的意见都更重要。)


0
投票

尝试

String.valueOf(yourObject)

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.