Scala和SLF4J :: 传递多个参数

8

以下是代码:

log.info("参数 {} 和 {}", param1, param2)

使用 SLF4J 在 Scala 中编译并正常工作。

但是,如果我想传递更多的参数,我需要使用数组:

log.info("parameters {} and {} and {}", Array(param1, param2,param3)) 

这只是简单地用数组转换为字符串替换第一个参数,然后保留其余参数未绑定。

以下代码

log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

代码无法编译,原因如下:

error: overloaded method value info with alternatives:
(org.slf4j.Marker,java.lang.String)Unit <and>
(java.lang.String,java.lang.Throwable)Unit <and>
(java.lang.String,Array[java.lang.Object])Unit <and>
(java.lang.String,Any)Unit
cannot be applied to (java.lang.String, Any)
log.info("parameters {} and {} and {}", Array(param1, param2,param3) : _*) 

我在这里错过了什么?

5个回答

7

我想这一切都取决于推断类型。接受数组的log.info方法期望一个Array[AnyRef]。因此,作为转换的替代方案,您可以执行以下操作:

log.info("parameters {} and {} and {}", Array[AnyRef](1, 2, "a"): _*)

但是这样做是行不通的,因为Int -> AnyRef之间的隐式转换受到限制。对于这些情况,你需要使用类型注释:

log.info("parameters {} and {} and {}", 
   Array[AnyRef](1: Integer, 2: Integer, "a"): _*)

更多细节请参见此问题:隐式转换的结果类型必须比AnyRef更具体


2

使用scala包装器slf4j,例如grizzled

如果您没有绑定到slf4j,则应查看Logula。我最近一直在使用它并且很喜欢。


3
每个项目依赖都意味着额外的未来维护工作。例如,@Falmarri在2012年提到的“Logula”现在被标记为“废弃”。 - Alexander Azarov

0

如果您使用字符串插值,会怎样呢?像这样:

log.info(f"parameters ${param1} and ${param2} and ${param3}")

1
log.info(s"参数 ${ 1/0 } 和..") 即使在 WARN 日志级别下也会抛出 / by zero 异常。 - Bùi Việt Thành
你可以将它设为lazy val,如下:lazy val dividedByZero = f"${1/0}";val levelWarn = true;if (levelWarn) println(dividedByZero);只有当levelWarn为true时,才会抛出NpE异常。我在代码中添加了分号来分隔行,因为我无法添加CR。 - Luis Ramirez-Monterosa

-1

试试这个:

Array(...).asInstanceOf[Array[Object]]

我尝试过这个。它没有报错,但也没有做正确的事情。它会将整个数组作为字符串放在第一个参数“{}”上,并将其余部分留空... - marios

-1

这是我的做法。

LOGGER.info("encode: {}, code: {}, length: {}", Array(messageWrapper, methodCode, bytes.length).asInstanceOf[Array[AnyRef]])

祝好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接