¿Cómo registrar mensajes formateados, matrices de objetos, excepciones?
¿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.
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.
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