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 String
o ¿existen otros métodos para imprimir todo el seguimiento de la pila de excepciones?
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 esjava.util.logging
pero no voy a votarte negativo porque me alegra descubrirlogger.log(Level, Exception, Supplier)
. Parece que Oracle ha hechojava.util.logging.Logger
en serio feo! Ya que estaban haciendo eso, es extraño que no lo llevaran más allá y crearanlogger.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
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()
enformat
. Echa un vistazo aSimpleFormatter
.– steinybot
03/04/2019 a las 21:35
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
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.
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 correctamenteout2.out.toString
. En casoout2.toString
-> ‘ImprimirStream@hash’– Nikita Zamalyutdinov
20 de noviembre de 2019 a las 12:04
en resumen: NO, no puedes.
– Bacterias
14/07/2015 a las 19:03
Claro, usa esto: commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/… de commons-lang3 3.4
– EpicPandaForce
14/07/2015 a las 19:03
¿En qué tipo de valor de cadena se convertiría “nada”?
– usuario2864740
14/07/2015 a las 19:09