2012-08-13 11 views
6

den folgenden Code zu haben: log.info ("Parameter {} und {}", param1, param2) kompiliert und arbeitet gut mit SLF4J in ScalaScala und SLF4J :: passieren mehrere Parameter

Allerdings, wenn ich wollen mehr Argumente zu übergeben, muss ich Array verwenden:

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

die einfach erste Parameter mit Array.toString ersetzt und verlässt übrigen Parameter ungebunden.

Der folgende Code

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

lässt sich nicht kompilieren, weil:

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) : _*) 

Was bin ich hier?

Antwort

2

Sie sollten eine scala-Wrapper für slf4j wie grizzled

verwenden Wenn Sie nicht SLF4J sind verpflichtet, Sie Logula heraus überprüfen sollten. Ich habe kürzlich damit gespielt und ich mag es.

+2

Jede Projektabhängigkeit ist eine zusätzliche zukünftige Wartungsarbeit. Zum Beispiel wird "Logula", das 2012 von @Falmarri erwähnt wurde, jetzt als "aufgegeben" markiert. –

-1

Versuchen Sie folgendes:

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

Ich habe das versucht. Es gibt keinen Fehler, aber es tut auch nicht das Richtige. Es wird das gesamte Array als String auf das erste Argument "{}" setzen und das verbleibende Leerzeichen lassen ... – marios

1

Ich denke, es ist alles auf dem abgeleiteten Typ abhängt. Die log.info-Methode, die ein Array akzeptiert, erwartet ein Array [AnyRef]. So als Alternative zu den Darstellern könnte man

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

tun, aber das wird nicht funktionieren, da es eine Beschränkung auf implizite Konvertierungen ist zwischen Int -> AnyRef. Für diejenigen, werden Sie eine Art Zuschreibung benötigen:

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

Sehen Sie diese Frage für weitere Informationen: Result type of an implicit conversion must be more specific than AnyRef

0

was, wenn Sie String-Interpolation verwenden? wie folgt:

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

log.info (s "Parameter $ {1/0} und ..") wird eine Exception werfen auch wenn in WARN Log-Level –

+0

wahr ist, können Sie es jedoch zu einem faulem Wert machen. lazy val dividiertByZero = f "$ {1/0}"; val levelWarn = wahr; if (levelWarn) println (dividiert ByZero); Dies wird NpE nur werfen, wenn LevelWarn wahr ist. Ich habe Semikolon hinzugefügt, um Zeilen zu begrenzen, da ich CR –

-1

Hier ist, wie ich es mache.

LOGGER.info ("kodieren: {}, Code: {}, Länge: {}", Array (messageWrapper, methodCode, bytes.length) .asInstanceOf [Array [AnyRef]])

Prost

+0

nicht hinzufügen kann Du hast diese Antwort nur dupliziert: http://stackoverflow.com/a/12094177/303737 –

Verwandte Themen