这是我遇到的具体问题.我正在使用SLF4J Logger(logger
下面的变量类型)
//After adding to a map
logger debug ("Adding {} = {}", key, value)
Run Code Online (Sandbox Code Playgroud)
这是eclipse中的鼠标悬停(和编译器)告诉我的.
模糊引用重载定义,两种方法调试特性记录器类型(x $ 1:字符串,x $ 2:对象*)单元和方法调试特性记录器类型(x $ 1:字符串,x $ 2:任意,x $ 3:任意)单位匹配参数类型(String,String,String)
我明白为什么他们含糊不清.我当然不是在和编译器争论:).我想简单地了解经验丰富的程序员如何解决这个问题.
以下是我可以使用的替代方案
创建和数组,并Object*
定义
logger debug ("Adding {} = {}", Array(key, value):_*)
演员 Any
logger debug ("Adding {} = {}", key.asInstanceOf[Any], value.asInstanceOf[Any])
这两种方法都没有特别吸引人.社区对我有更好的方法或建议吗?
非常感谢!
我会用
logger.debug("Adding {} = {}", key, value: Any)
Run Code Online (Sandbox Code Playgroud)
或者可以使用以下内容:
logger.debug("Adding {} = {}", Array(key, value):_*)
Run Code Online (Sandbox Code Playgroud)
请注意:_*
.如果省略这些符号,它将调用Object*
仅提供1个参数的方法,该参数将是一个数组.
首先是对@Shadowlands,@ ArneClaassen和@OlgeRudenko的信任.正如评论中所提到的,这似乎是已知问题.这阻止了我试图"解决"它.接下来要做的是找到一个没有破坏Scala成语的好工作.
考虑到这些限制,我选择了如上所述的String Interpolation.我也改用了scala-logging.引用他们的GitHub/README,
Scala Logging是一个包含SLF4J的方便且高效的日志记录库.这很方便,因为您可以简单地调用日志方法而无需检查是否启用了相应的日志级别:
logger.debug(s"一些昂贵的消息!")
这是高效的,因为感谢Scala宏,应用了check-enabled-idiom,就像编写这个更复杂的代码一样:
if(logger.isDebugEnabled)logger.debug(s"一些昂贵的消息!")
谢谢大家!就我而言,这已得到解决.如果评论员可以发表他们的答案,我将很乐意承认他们.
一如既往,站在友好巨人的肩膀上感觉很好!
PS:我刚刚验证了如果使用scala-logging,则String插值没有执行成本.我的验证方法粗糙但有效.
log.debug{
{
throw new IllegalAccessException("This should not have been called with debug off!")
}
s"Added Header ${name}:${headerValue}"
}
Run Code Online (Sandbox Code Playgroud)
果然,当我将日志设置为时DEBUG
,异常会按预期抛出,但当我将其设置为更高级别时会消失.是的,我已经删除了IllegalAccessException
部分:).