2010-09-15 21 views
12

yo era coger una excepción y tratando de escribir el seguimiento de la pila de los registros de la siguiente manera:¿Cómo se escribe una traza de pila completa en el registro?

log.warn(e.getMessage()); 

Pero todo lo que dijo fue

null 

así que lo cambié a

log.warn(e.toString()); 

Y ahora solo dice

java.lang.NullPointerException 

¿Cómo escribo el seguimiento completo de la pila en el registro para poder ver dónde se genera esta excepción en la aplicación?

Respuesta

28

Por lo general:

log.warn("message", e); 

Pero depende de su marco de registro también.

3

En el método de excepción, el String subyacente que contiene el mensaje es null.

La respuesta anterior, ahora se ponchó, todavía lleva a cabo, excepto que e no es nulo, pero la variable detailMessage instancia privada de la clase Throwable es nula, por lo que e.getMessage() es la cadena null, pero e.toString() (que las llamadas que subyace nulodetailMessage.toString) arroja un NullPointerException.

+1

si e era nula, inicie una sesión. advertir (e.getMessage()); arrojaría una excepción y no imprimiría "nulo". –

+0

No, no arrojaría un NPE –

+0

Lo siento, leí mal su comentario –

1

Usando log4j esto se hace con:

logger.error ("Error", excepción); El primer argumento es un mensaje para mostrar, el segundo es la excepción (throwable) cuya stacktrace se registra.

Otra opción es commons-logging, donde es el mismo:

log.error ("Mensaje", excepción);

Con java.util.logging esto se puede hacer a través de:

Logger.log (Nivel.SEVERE, "Mensaje", excepción);

1

Si usando java8 puede hacer lo siguiente:

 LOGGER.error("Caught exception while methodX. Please investigate: " 
       + exception 
       + Arrays.asList(exception.getStackTrace()) 
       .stream() 
       .map(Objects::toString) 
       .collect(Collectors.joining("\n")) 
     ); 
+0

Funciona muy bien y también es útil durante las sesiones de depuración cuando las excepciones no se registran correctamente. – alexandrul

0

Si está utilizando una versión de Java anterior a 8, puede intentar esto:

  LOGGER.error("Error al recuperar proveedores de la base de datos: " + 
      e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){ 
        @Override 
        public Object apply(Object t) { 
         return t.toString(); 
        } 
       }).collect(Collectors.joining("\n"))); 
Cuestiones relacionadas