Wie protokolliere ich einen Stacktrace mit der Logger-Klasse von Java?

Lesezeit: 4 Minuten

Benutzeravatar von Surya Joseph
Surja Josef

Ich verwende Java Logger Klasse. Ich möchte passieren ex.printStackTrace() hinein Logger.log(loglevel, String)sondern printStackTrace() kehrt zurück void. Daher kann ich den Stack-Trace der Ausnahme nicht übergeben und drucken.

Gibt es eine Möglichkeit, die ich umwandeln kann void hinein Stringoder gibt es andere Methoden, um den gesamten Stack-Trace von Ausnahmen zu drucken?

  • kurz gesagt: NEIN, du kannst nicht.

    – Bakterien

    14. Juli 2015 um 19:03 Uhr

  • Sicher, benutze das: commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/… von commons-lang3 3.4

    – EpicPandaForce

    14. Juli 2015 um 19:03 Uhr


  • In welche Art von Zeichenfolgenwert würde „nichts“ umgewandelt werden?

    – Benutzer2864740

    14. Juli 2015 um 19:09 Uhr

Benutzeravatar von Saif Asif
Saif Asif

Das müssen Sie verstehen void ist eigentlich nothingness. Was nichts ist, kann man nicht umwandeln. Sie könnten am Ende drucken void als String, aber (vertrau mir), das willst du nicht.

Ich denke, wonach du suchst

// 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 Einzelheiten finden Sie in der Java-Dokumentation für Ausnahme#getMessage()

  • Danke Saif Asif. Ich kann jetzt den gesamten Stack-Trace protokollieren.

    – Surya Josef

    14. Juli 2015 um 19:27 Uhr

  • logger.error() ist nicht java.util.loggingaber ich werde Sie nicht ablehnen, weil ich froh bin, es zu entdecken logger.log(Level, Exception, Supplier) . Sieht aus wie Oracle gemacht haben java.util.logging.Logger ernsthaft hässlich! Da sie das taten, ist es seltsam, dass sie nicht weiter gingen und etwas kreierten logger.severe(String, Exception) etc

    – Adam

    11. Oktober 2017 um 12:56 Uhr


  • Die Frage fragt nach einer Lösung mit der Klasse Logger von Java. java.util.logging.Logger hat keine Methode namens “error”. Ich habe diese Antwort nur deshalb abgelehnt.

    – DAB

    28. August 2018 um 15:36 Uhr

  • Dies entspricht überhaupt nicht der ursprünglichen Absicht, den Stack-Trace an einen Logger zu drucken. getMessage() ist dafür nicht gemacht.

    – A.Gille

    22. Mai 2020 um 12:28 Uhr

  • Die Antwort lautet also: logger.log(Level.SEVERE, ex.getMessage(), ex);

    – Kenny

    14. Oktober 2020 um 10:13 Uhr


Benutzeravatar von hzpz
hzpz

Verwenden java.util.logging.Logger#log(Level, String, Throwable) und eintreten ex als drittes argument so:

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

  • Ich erhalte keinen Stack-Trace, um damit zu protokollieren, nur das zweite Argument.

    – Panu Haaramo

    13. Januar 2018 um 20:23 Uhr

  • Es ist möglich, den Stack-Trace zu unterdrücken, indem Sie das Protokollformat ändern. Welchen Formatierer verwenden Sie und wie sieht Ihr Protokollformat aus?

    – Hzpz

    19. Januar 2018 um 12:25 Uhr

  • Dies ist die eigentliche Antwort auf die Frage.

    – Steinbot

    3. April 2019 um 21:34 Uhr

  • @PanuHaaramo Es hängt davon ab, welchen Formatierer Sie verwenden. Der Formatierer muss anrufen record.getThrown() in format. Schauen Sie sich an SimpleFormatter.

    – Steinbot

    3. April 2019 um 21:35 Uhr

Benutzeravatar von Rutuja
Rutuja

Eine weitere Alternative wäre auch:

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

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

  • Wenn Sie sich auf org.apache.commons.lang3.exception.ExceptionUtils beziehen, ist es ExceptionUtils.getStackTrace(e)

    – JoschJava

    4. September 2018 um 15:46 Uhr


Benutzeravatar von sleeloy
schläfrig

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

Sie können so etwas tun

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

Mit dem folgenden Format können Sie den Stack-Trace haben:

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 druckt den Stack-Trace.

Benutzeravatar von Makoto
Makoto

Sie können nicht konvertieren void hinein String; eine solche Konvertierung existiert nicht. void kehrt nicht zurück irgendetwas zurück, so dass Sie keinen Wert abrufen müssen.

Was Sie wahrscheinlich tun möchten, ist, stattdessen die Nachricht der Ausnahme per zu erhalten ex.getMessage().

Du kannst den … benutzen getStackTrace() -Methode, um ein Array von StackTraceElements abzurufen und daraus einen String zu generieren. Andernfalls, wenn nur die letzte Fehlermeldung ausreicht, verwenden Sie die getMessage() Methode wie von Makoto vorgeschlagen.

Um den Stack-Trace als String aus einer Reihe von StackTraceElement Objekte müssen Sie über das Array iterieren (aus der JDK7-Quelle):

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

Eine weitere Option ist die Verwendung 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");

  • Verwenden Sie einfach die Apache Commons ExceptionUtils-Bibliothek; Sie müssen das Rad nicht neu erfinden

    – beresfordt

    14. Juli 2015 um 19:11 Uhr

  • 1. String message = out1.toString("UTF8"); – Kompilierungsfehler, erwartete 0 Parameter, bekam aber 1 2. Es funktioniert korrekt out2.out.toString. Im Fall out2.toString -> ‘PrintStream@hash’

    – Nikita Samaljutdinov

    20. November 2019 um 12:04 Uhr


1441340cookie-checkWie protokolliere ich einen Stacktrace mit der Logger-Klasse von Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy