log4j 中的参数化替换需要空字符串?

Parameterized replacements in log4j needs empty string?

./spark-shell

scala> import org.slf4j.{Logger, LoggerFactory}
import org.slf4j.{Logger, LoggerFactory}

scala> val LOGGER = LoggerFactory.getLogger("testing")
LOGGER: org.slf4j.Logger = org.slf4j.impl.Log4jLoggerAdapter(testing)

scala> val v1 = "1"
v1: String = 1

scala> val v2 = "2"
v2: String = 2

这不符合我的预期:

scala> LOGGER.warn("something {}, something {}", v1, v2)
<console>:30: error: ambiguous reference to overloaded definition,
both method warn in trait Logger of type (x: String, x: Any, x: Any)Unit
and  method warn in trait Logger of type (x: String, x: Object*)Unit
match argument types (String,String,String)
       LOGGER.warn("something {}, something {}", v1, v2)
              ^

但是这样做:

scala> LOGGER.warn("something {}, something {}", v1, v2, "")
16/05/30 10:16:59 WARN testing: something 1, something 2

我这里有什么问题吗?

它实际上不需要空字符串,但至少需要 3 个参数或类型转换。实际上,有两个与公司匹配的重载方法,就是那里显示的两个。因此,如果您需要放置除 2 个以外的任意数量的项目,一切都会如您所愿。在这种特殊情况下,对于两个对象,您可以执行以下操作之一:

  1. 插入第三个参数,使第二个公司((x: String, x: Object*)Unit)匹配,就像你说的(第三个参数将被忽略)。
  2. 将两个参数转换为 Any,这样第一个公司将被匹配(通过键入 LOGGER.warn("something {}, something {}", v1:Any, v2:Any)