Angenommen, Sie fangen eine Ausnahme ab und erhalten Folgendes für die Standardausgabe (z. B. die Konsole), wenn Sie eine e.printStackTrace () ausführen :
java.io.FileNotFoundException: so.txt
at java.io.FileInputStream.<init>(FileInputStream.java)
at ExTest.readMyFile(ExTest.java:19)
at ExTest.main(ExTest.java:7)
Jetzt möchte ich dies stattdessen an einen Logger wie beispielsweise log4j senden, um Folgendes zu erhalten:
31947 [AWT-EventQueue-0] ERROR Java.io.FileNotFoundException: so.txt
32204 [AWT-EventQueue-0] ERROR at java.io.FileInputStream.<init>(FileInputStream.java)
32235 [AWT-EventQueue-0] ERROR at ExTest.readMyFile(ExTest.java:19)
32370 [AWT-EventQueue-0] ERROR at ExTest.main(ExTest.java:7)
Wie kann ich das machen?
try {
...
} catch (Exception e) {
final String s;
... // <-- What goes here?
log.error( s );
}
java
logging
log4j
stack-trace
SyntaxT3rr0r
quelle
quelle
log.error(e.getLocalizedMessage(), e)
was völlig überflüssig ist. Behandelt es eine Null für das erste Argument?log4j-1.2.8.jar
und ich wollte allesstackTrace
in meiner Protokolldatei drucken, also habe ich es wie oben erwähnt versucht, aber es wird nur in meiner Protokolldatei gedrucktnullPointerException
. Ich wurde für meinen Code verwendete.printStackTrace()
, der alle Spuren druckt. Warum diese Kolavery?Wenn Sie einen Stacktrace ohne Ausnahme protokollieren möchten, gehen Sie wie folgt vor:
quelle
Sie können die Stapelverfolgung auch als Zeichenfolge über abrufen
ExceptionUtils.getStackTrace
.Siehe: ExceptionUtils.java
Ich benutze es nur für
log.debug
, umlog.error
einfach zu halten .quelle
Nur weil es mir passiert ist und nützlich sein kann. Wenn du das tust
Sie erhalten den Header der Ausnahme und nicht den gesamten Stacktrace. Weil der Logger denkt, dass Sie einen String übergeben. Mach es ohne,
{}
wie Skaffman sagtequelle
Throwable.toString()
es keinen Stacktrace zurückgibt . (Angenommen, Sie verwenden einen Logger, der weiß, was mit '{}' zu tun ist.)Die Antwort von skaffman ist definitiv die richtige Antwort. Alle Logger Methoden wie
error()
,warn()
,info()
,debug()
nehmen Throwable als zweiten Parameter:Sie können Stacktrace jedoch auch als String extrahieren. Manchmal kann es nützlich sein, wenn Sie die Formatierungsfunktion mit dem Platzhalter "{}" nutzen möchten - siehe Methode. Wenn Sie
void info(String var1, Object... var2);
in diesem Fall einen Stacktrace als String haben, können Sie tatsächlich Folgendes tun:Dadurch werden die parametrisierte Nachricht und die Stapelverfolgung am Ende auf dieselbe Weise gedruckt wie bei der Methode:
logger.error("error: ", e);
Ich habe tatsächlich eine Open-Source-Bibliothek geschrieben, die ein Dienstprogramm zum Extrahieren eines Stacktraces als String enthält, mit der Option, Rauschen aus dem Stacktrace intelligent herauszufiltern. Das heißt, wenn Sie das Paketpräfix angeben, an dem Sie interessiert sind, wird Ihr extrahierter Stacktrace aus einigen irrelevanten Teilen herausgefiltert und Sie erhalten sehr umfangreiche Informationen. Hier ist der Link zu dem Artikel, der erklärt, welche Dienstprogramme die Bibliothek hat und wo sie erhältlich ist (sowohl als Maven-Artefakte als auch als Git-Quellen) und wie man sie auch verwendet. Open Source Java-Bibliothek mit Stack-Trace-Filterung, Silent String-Parsing-Unicode-Konverter und Versionsvergleich Siehe Abschnitt " Stacktrace-Rauschfilter "
quelle
Diese Antwort bezieht sich möglicherweise nicht auf die gestellte Frage, sondern auf den Titel der Frage.
ODER
ODER
quelle
In Log4j 2 können Sie Logger.catching () verwenden , um einen Stacktrace von einer Ausnahme zu protokollieren, die abgefangen wurde.
quelle
Dies wäre eine gute log4j-Fehler- / Ausnahmeprotokollierung - lesbar durch Splunk / andere Protokollierung / Überwachung s / w. Alles ist eine Form eines Schlüssel-Wert-Paares. log4j würde den Stack-Trace von Exception obj erhalten
e
quelle
quelle
Sie können den folgenden Code verwenden:
Hier können Sie einfach anrufen:
LogWriterUtility.errorWithAnalysis( YOUR_EXCEPTION_INSTANCE);
Es wird stackTrace in Ihr Protokoll drucken.
quelle
Erstellen Sie dies
class
:Nennen Sie dies in Ihrem Code
quelle