Wie protokolliere ich einen Stacktrace mit der Logger-Klasse von Java?
Lesezeit: 4 Minuten
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?
In welche Art von Zeichenfolgenwert würde „nichts“ umgewandelt werden?
– Benutzer2864740
14. Juli 2015 um 19:09 Uhr
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);
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.
Der Punkt in diesem Muster ist %6$s. Es druckt den Stack-Trace.
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
14413400cookie-checkWie protokolliere ich einen Stacktrace mit der Logger-Klasse von Java?yes
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