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 个以外的任意数量的项目,一切都会如您所愿。在这种特殊情况下,对于两个对象,您可以执行以下操作之一:
- 插入第三个参数,使第二个公司(
(x: String, x: Object*)Unit
)匹配,就像你说的(第三个参数将被忽略)。
- 将两个参数转换为
Any
,这样第一个公司将被匹配(通过键入 LOGGER.warn("something {}, something {}", v1:Any, v2:Any)
)
./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 个以外的任意数量的项目,一切都会如您所愿。在这种特殊情况下,对于两个对象,您可以执行以下操作之一:
- 插入第三个参数,使第二个公司(
(x: String, x: Object*)Unit
)匹配,就像你说的(第三个参数将被忽略)。 - 将两个参数转换为
Any
,这样第一个公司将被匹配(通过键入LOGGER.warn("something {}, something {}", v1:Any, v2:Any)
)