webentwicklung-frage-antwort-db.com.de

Wie protokolliere ich einen Stack-Trace mit der Java Logger-Klasse?

Ich verwende die Logger-Klasse von Java. Ich möchte ex.printStackTrace() an Logger.log(loglevel, String) übergeben, aber printStackTrace() gibt void zurück. Daher kann ich die Stack-Trace der Ausnahme nicht übergeben und drucken.

Gibt es eine Möglichkeit, void in String umzuwandeln, oder gibt es andere Methoden, um den gesamten Stack-Trace der Ausnahmen zu drucken?

14
Surya Joseph

Sie müssen verstehen, dass void tatsächlich nothingness ist. Sie können nichts umwandeln. Sie könnten void am Ende als Zeichenfolge drucken, aber (vertrauen Sie mir), das möchten Sie nicht.

Ich denke, was Sie suchen, ist 

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

Dadurch wird die Fehlermeldung mit dem von Ihnen konfigurierten Logger gedruckt. Weitere Informationen finden Sie in den Java-Dokumenten zu Exception # getMessage ()

26
Saif Asif

Verwenden Sie Java.util.logging.Logger#log(Level, String, Throwable) und übergeben Sie ex als drittes Argument wie folgt:

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

Sie können void nicht in String konvertieren. Eine solche Konvertierung ist nicht vorhanden. void gibt nothing nicht zurück, sodass Sie keinen Wert abrufen können.

Sie möchten wahrscheinlich die Meldung der Ausnahme stattdessen über ex.getMessage() erhalten.

6
Makoto

Eine weitere Alternative wäre:

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

Sie können die Methode getStackTrace () verwenden, um ein Array von StackTraceElements abzurufen und daraus einen String zu generieren. Andernfalls verwenden Sie, wenn nur die letzte Fehlermeldung ausreicht, die von Makoto vorgeschlagene Methode getMessage().

Um die Stack-Ablaufverfolgung als String aus einem Array von StackTraceElement-Objekten abzurufen, müssen Sie das Array durchlaufen (aus der JDK7-Quelle entnommen):

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

Eine andere Option ist printStackTrace(PrintStream s), wo Sie angeben können, wo der Stacktrace gedruckt werden soll:

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

Mit dem folgenden Format können Sie den Stack verfolgen: 

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

Der Punkt in diesem Muster ist% 6 $ s. Es wird die Stapelverfolgung gedruckt.

0
iman

Danke euch allen. Ich kann die Stack-Trace-Details mit protokollieren 

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

Wie Makoto sagt, möchten Sie wahrscheinlich eine ex.getMessage () machen.

Zur weiteren Verdeutlichung bedeutet void, dass nichts zurückgegeben wird. Du kannst nichts in etwas werfen :)

0
kotakotakota

sie können Stacktrace in String konvertieren. Wenn e das Ausnahmeobjekt ist 

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

Es gibt eine überladene printStackTrace-Methode, die einen PrintWriter unterstützt.

Sie können so etwas tun

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