¿Cómo registro un stacktrace usando la clase Logger de Java?

4 minutos de lectura

Avatar de usuario de Surya Joseph
José Surya

estoy usando java Logger clase. quiero pasar ex.printStackTrace() en Logger.log(loglevel, String)pero printStackTrace() devoluciones void. Por lo tanto, no puedo pasar e imprimir el seguimiento de la pila de la excepción.

¿Hay alguna manera de que pueda convertir void en Stringo ¿existen otros métodos para imprimir todo el seguimiento de la pila de excepciones?

Avatar de usuario de Saif Asif
saif asif

Necesitas entender eso void es en realidad nothingness. No se puede convertir lo que es nada. Podría terminar imprimiendo void como una cadena, pero (confía en mí), no quieres eso.

creo que lo que buscas es

// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)

Esto imprimirá el mensaje de error utilizando el registrador que ha configurado. Para obtener más detalles, puede echar un vistazo a los documentos de Java para Excepción#getMessage()

  • Gracias Saif Asif. Puedo registrar todo el seguimiento de la pila ahora.

    – Surya Joseph

    14/07/2015 a las 19:27

  • logger.error() no es java.util.loggingpero no voy a votarte negativo porque me alegra descubrir logger.log(Level, Exception, Supplier) . Parece que Oracle ha hecho java.util.logging.Logger en serio feo! Ya que estaban haciendo eso, es extraño que no lo llevaran más allá y crearan logger.severe(String, Exception) etc.

    – Adán

    11 de octubre de 2017 a las 12:56


  • La pregunta solicita una solución utilizando la clase Logger de Java. java.util.logging.Logger no tiene un método llamado “error”. He votado negativamente esta respuesta solo por eso.

    – DAB

    28 de agosto de 2018 a las 15:36

  • Esto no responde en absoluto a la intención inicial de imprimir el seguimiento de la pila en un registrador. getMessage() no está hecho para esto.

    – A.Gille

    22 de mayo de 2020 a las 12:28

  • Entonces, la respuesta es: logger.log(Level.SEVERE, ex.getMessage(), ex);

    -Kenny

    14 oct 2020 a las 10:13


avatar de usuario de hzpz
hzpz

Usar java.util.logging.Logger#log(Level, String, Throwable) y pasar ex como tercer argumento así:

LOGGER.log(Level.INFO, ex.getMessage(), ex);

  • No obtengo el seguimiento de la pila para iniciar sesión con esto, solo el segundo argumento.

    – Panu Haramo

    13 de enero de 2018 a las 20:23

  • Es posible suprimir el seguimiento de la pila cambiando el formato del registro. ¿Qué formateador está utilizando y cómo se ve su formato de registro?

    -hzpz

    19 de enero de 2018 a las 12:25

  • Esta es la verdadera respuesta a la pregunta.

    – steinybot

    3 abr 2019 a las 21:34

  • @PanuHaaramo Depende del formateador que use. El formateador necesita llamar record.getThrown() en format. Echa un vistazo a SimpleFormatter.

    – steinybot

    03/04/2019 a las 21:35

Avatar de usuario de Rutuja
Rutuja

También otra alternativa sería:

import org.apache.commons.lang3.exception.ExceptionUtils;

log.error("Exception : " + ExceptionUtils.getStackTrace(exception));

  • Si se refiere a org.apache.commons.lang3.exception.ExceptionUtils, es ExceptionUtils.getStackTrace(e)

    – JoschJava

    4 sep 2018 a las 15:46


avatar de usuario de sleeloy
sleeloy

Hay un método printStackTrace sobrecargado que acepta un PrintWriter.

puedes hacer algo como esto

Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());

Con el siguiente formato, puede tener el seguimiento de la pila:

java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n

El punto en este patrón es %6$s. Imprimirá el seguimiento de la pila.

Avatar de usuario de Makoto
makoto

no puedes convertir void en String; no existe tal conversión. void no regresa cualquier cosa atrás, por lo que no tiene valor para recuperar.

Lo que probablemente quiera hacer es recibir el mensaje de la excepción a través de ex.getMessage().

Puedes usar el obtenerStackTrace() método para obtener una matriz de StackTraceElements y generar una cadena desde allí. De lo contrario, si solo el mensaje de error final es suficiente, use el getMessage() método sugerido por Makoto.

Para obtener el seguimiento de la pila como un String de una matriz de StackTraceElement objetos, debe iterar sobre la matriz (tomada de la fuente JDK7):

StringBuilder builder = new StringBuilder();
StackTraceElement[] trace = getOurStackTrace();
    for (StackTraceElement traceElement : trace)
        builder.append("\tat " + traceElement + "\n");

Otra opción es usar printStackTrace(PrintStream s)donde puede especificar dónde desea que se imprima el stacktrace:

ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");

  • Simplemente use la biblioteca ExceptionUtils de apache commons; No hay necesidad de reinventar la rueda

    – beresfordt

    14/07/2015 a las 19:11

  • 1. String message = out1.toString("UTF8"); – error de compilación, esperaba 0 parámetros, pero obtuvo 1 2. Funciona correctamente out2.out.toString. En caso out2.toString -> ‘ImprimirStream@hash’

    – Nikita Zamalyutdinov

    20 de noviembre de 2019 a las 12:04


¿Ha sido útil esta solución?