2012-08-13 29 views
6

que tiene la siguiente código: log.info ("parámetros {} y {}", param1, param2) compila y funciona bien con SLF4J en ScalaScala y SLF4J :: pasar varios parámetros

Sin embargo si quiere pasar más argumentos, necesito utilizar matriz:

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

que simplemente se sustituye primer parámetro con Array.toString y deja resto de parámetros no unidos.

El siguiente código

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

no compila, a causa de:

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

Qué me estoy perdiendo aquí?

Respuesta

2

se debe utilizar un envoltorio Scala de slf4j como grizzled

Si no está obligado a SLF4J, que debe salir Logula. He estado jugando con eso recientemente y me gusta.

+2

Cada dependencia del proyecto es un trabajo de mantenimiento futuro adicional. Por ejemplo, "Logula" mencionado por @Falmarri en 2012 ahora está marcado como "abandonado" –

-1

Prueba esto:

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

Lo intenté. No da un error, pero tampoco hace lo correcto. Pondrá toda la matriz como una cadena en el primer argumento "{}" y dejará el espacio en blanco restante ... – marios

1

Supongo que todo depende del tipo inferido. El método log.info que toma una matriz espera una matriz [AnyRef]. Así como una alternativa al elenco que podría hacer

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

Pero esto no funcionará, ya que hay una restricción en las conversiones implícitas entre Int -> AnyRef. Para aquellos, que necesita un tipo de adscripción:

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

Ver esta cuestión para más detalles: Result type of an implicit conversion must be more specific than AnyRef

0

lo que si se utiliza la interpolación de cadenas? como ese:

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

log.info (s "parámetros $ {1/0} y ...") arrojará/por excepción cero incluso si está en el nivel de registro de WARN –

+0

cierto, puede hacerlo vago. lazy val dividedByZero = f "$ {1/0}"; val levelWarn = true; if (levelWarn) println (dividedByZero); esto arrojará NpE solo cuando levelWarn sea verdadero. Agregué punto y coma para delimitar líneas, ya que no puedo agregar CR –

-1

Así es como lo hago.

LOGGER.info ("codificar: {}, código: {}, longitud: {}", Array (MessageWrapper, methodCode, bytes.length) .asInstanceOf [Array [AnyRef]])

Saludos

+0

Acabas de duplicar esta respuesta: http://stackoverflow.com/a/12094177/303737 –

Cuestiones relacionadas