¿Cómo registrar mensajes formateados, matrices de objetos, excepciones?

Resuelto rowe asked hace 13 años • 0 respuestas

¿Cuál es el enfoque correcto para registrar tanto un mensaje completo como un seguimiento de pila de la excepción?

logger.error(
    "\ncontext info one two three: {} {} {}\n",
    new Object[] {"1", "2", "3"},
    new Exception("something went wrong"));

Me gustaría producir un resultado similar a este:

context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...

Mi versión de SLF4J es 1.6.1.

rowe avatar Jun 16 '11 19:06 rowe
Aceptado

A partir de SLF4J 1.6.0, en presencia de múltiples parámetros y si el último argumento en una declaración de registro es una excepción, SLF4J supondrá que el usuario quiere que el último argumento sea tratado como una excepción y no como un simple parámetro. Consulte también la entrada de preguntas frecuentes correspondiente .

Entonces, escribiendo (en SLF4J versión 1.7.x y posteriores)

 logger.error("one two three: {} {} {}", "a", "b", 
              "c", new Exception("something went wrong"));

o escribiendo (en SLF4J versión 1.6.x)

 logger.error("one two three: {} {} {}", new Object[] {"a", "b", 
              "c", new Exception("something went wrong")});

rendirá

one two three: a b c
java.lang.Exception: something went wrong
    at Example.main(Example.java:13)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at ...

El resultado exacto dependerá del marco subyacente (por ejemplo, logback, log4j, etc.), así como de cómo esté configurado el marco subyacente. Sin embargo, si el último parámetro es una excepción, se interpretará como tal independientemente del marco subyacente.

Ceki avatar Jun 16 '2011 15:06 Ceki

Además de la respuesta de @Ceki, si está utilizando Logback y configura un archivo de configuración en su proyecto (generalmente logback.xml), también puede definir el registro para trazar el seguimiento de la pila usando

<encoder>
    <pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern> 
</encoder>

el %ex en el patrón es lo que marca la diferencia

Yaniv avatar Jan 28 '2014 09:01 Yaniv