web-dev-qa-db-fra.com

Comment enregistrer une trace de pile à l'aide de la classe Java Logger

J'utilise la classe Logger de Java. Je veux passer ex.printStackTrace() dans Logger.log(loglevel, String), mais printStackTrace() renvoie void. Je ne peux donc pas transmettre et imprimer la trace de pile de l'exception.

Existe-t-il un moyen de convertir void en String ou existe-t-il d'autres méthodes permettant d'imprimer la trace entière de la pile d'exceptions?

14
Surya Joseph

Vous devez comprendre que void est en fait nothingness. Vous ne pouvez pas convertir ce qui n'est rien. Vous pourriez finir par imprimer void sous forme de chaîne, mais (croyez-moi), vous ne le souhaitez pas.

Je pense que ce que vous cherchez, c'est 

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

Cela imprimera le message d'erreur à l'aide du consignateur que vous avez configuré. Pour plus de détails, vous pouvez consulter la documentation Java pour Exception # getMessage ()

26
Saif Asif

Utilisez Java.util.logging.Logger#log(Level, String, Throwable) et transmettez ex comme troisième argument comme ceci:

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

Vous ne pouvez pas convertir void en String; une telle conversion n'existe pas. void ne renvoie pas rien, vous n'avez donc aucune valeur à récupérer.

Ce que vous voulez probablement faire, c'est recevoir le message de l'exception à la place via ex.getMessage() .

6
Makoto

Une autre alternative serait aussi:

log.error("Exception : "+ExceptionUtils.getFullStackTrace(e));
4
Rutuja

Vous pouvez utiliser la méthode getStackTrace () pour obtenir un tableau de StackTraceElements et générer une chaîne à partir de là. Sinon, si seul le dernier message d'erreur est suffisant, utilisez la méthode getMessage() proposée par Makoto.

Pour obtenir la trace de pile sous la forme String à partir d'un tableau d'objets StackTraceElement, vous devez effectuer une itération sur le tableau (extrait du source JDK7):

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

Une autre option consiste à utiliser printStackTrace(PrintStream s), où vous pouvez spécifier l'endroit où vous voulez que le stacktrace soit imprimé:

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

Avec le format ci-dessous, vous pouvez avoir la trace de la pile: 

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

Le point dans ce modèle est% 6 $ s. Il va imprimer la trace de la pile.

0
iman

Merci à tous. Je peux enregistrer les détails de la trace de la pile à l'aide de 

LOGGER.log(Level.INFO, ex.getMessage(),ex);
//ex is my exception object
0
Surya Joseph

Comme le dit Makoto, vous voudrez probablement faire un ex.getMessage ().

Pour clarifier davantage, void signifie qu'il n'y a rien retourné. Vous ne pouvez rien jeter dans quelque chose :)

0
kotakotakota

vous POUVEZ convertir stacktrace en String en utilisant ci-dessous. Si e est l'objet exception 

StringWriter stringWriter= new StringWriter();
PrintWriter printWriter= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTraceAsString= stringWriter.toString(); 
0
Amit.rk3

Il existe une méthode printStackTrace surchargée qui prend un PrintWriter.

Vous pouvez faire quelque chose comme ça

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