2011-06-16 10 views
196

¿Cuál es el enfoque correcto para registrar tanto un mensaje poblado como un seguimiento de pila de la excepción?slf4j: cómo registrar un mensaje formateado, conjunto de objetos, excepción

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

me gustaría para producir una salida similar a esto:

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

slf4j versión 1.6.1

Respuesta

302

Como de SLF4J 1.6.0, en la presencia de múltiples parámetros y si el último argumento en una declaración de registro es una excepción, luego SLF4J presumirá que el usuario quiere que el último argumento sea tratado como una excepción y no como un parámetro simple. Vea también el relevant FAQ entry.

Así, la escritura (en la versión 1.7.x SLF4J y más tarde)

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

o escribir (en la versión 1.6.x SLF4J)

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.) y de cómo se configura el marco subyacente. Sin embargo, si el último parámetro es una excepción, se interpretará como tal independientemente del marco subyacente.

+0

He intentado con 1.6.1 y la salida se muestra a continuación. Tenga en cuenta que falta el rastro de la pila: ' 2011-06-16 17: 20: 57,570 DEPURACIÓN [principal] SLF4JDemo.main (12): información de contexto uno dos tres: 1 2 3 java.lang.Exception: algo salió mal ' – rowe

+4

¿Qué estructura de registro subyacente estás usando? Como mencioné en mi respuesta anterior, si el último parámetro es una excepción, se interpretará como tal independientemente del marco subyacente. (Probado con logback, slf4j-log4j12, slf4j-jdk14 y slf4j-simple.) – Ceki

+3

Lo siento, no reconocí que en su ejemplo utilizó n = 3 marcadores de posición en el formato de cadena y n + 1 = 4 elementos en la matriz de objetos . Tenía n marcadores de posición en la cadena de formato y también n elementos en la matriz de objetos más una excepción como tercer parámetro. Mi expectativa era que la excepción se imprimiría con stacktrace, pero esto nunca sucedió. ¿Funciona esto como se diseñó? Además, si tengo n marcadores de posición y n elementos en la matriz de objetos, con la excepción de que es el último elemento, no veo ningún stacktrace. Tal vez los n placeholders con n + 1 objetos en una matriz deberían enfatizarse un poco más. – rowe

4

Además de respuesta @Ceki 's, Si está utilizando logback y la configuración de un archivo de configuración en su proyecto (por lo general logback.xml), se puede definir el registro para trazar el seguimiento de pila, así usando

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

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

Cuestiones relacionadas