Powiedzmy, że wychwytujesz wyjątek i otrzymujesz następujące informacje na standardowym wyjściu (takim jak, powiedzmy, konsola), jeśli wykonujesz e.printStackTrace () :
java.io.FileNotFoundException: so.txt
at java.io.FileInputStream.<init>(FileInputStream.java)
at ExTest.readMyFile(ExTest.java:19)
at ExTest.main(ExTest.java:7)
Teraz chcę wysłać to zamiast tego do rejestratora, takiego jak, powiedzmy, log4j, aby uzyskać następujące informacje:
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)
W jaki sposób mogę to zrobić?
try {
...
} catch (Exception e) {
final String s;
... // <-- What goes here?
log.error( s );
}
java
logging
log4j
stack-trace
Składnia T3rr0r
źródło
źródło
log.error(e.getLocalizedMessage(), e)
co jest całkowicie zbędne. Czy obsługuje wartość null dla pierwszego argumentu?log4j-1.2.8.jar
i chciałem wydrukować wszystkostackTrace
w moim pliku dziennika, więc próbowałem tak, jak wspomniałeś powyżej, ale drukuje tylko na moim pliku dziennikanullPointerException
. Zostałem użyty w moim kodzie,e.printStackTrace()
który wyświetla wszystkie ślady. Dlaczego ten Kolavery?Jeśli chcesz zarejestrować ślad stosu bez angażowania wyjątku, zrób to:
źródło
Możesz również pobrać ślad stosu jako ciąg znaków za pośrednictwem
ExceptionUtils.getStackTrace
.Zobacz: ExceptionUtils.java
Używam go tylko
log.debug
dolog.error
prostoty.źródło
Tylko dlatego, że mi się to przydarzyło i może być przydatne. Jeśli to zrobisz
otrzymasz nagłówek wyjątku, a nie cały ślad stosu. Ponieważ logger pomyśli, że przekazujesz String. Zrób to bez,
{}
jak powiedział skaffmanźródło
Throwable.toString()
nie zwraca śladu stosu. (Zakładając, że używasz loggera, który wie, co zrobić z '{}'.)Odpowiedź od skaffmana jest zdecydowanie poprawna. Wszystkie metody logger takie jak
error()
,warn()
,info()
,debug()
wziąć Throwable jako drugi parametr:Możesz jednak również wyodrębnić stacktrace jako ciąg. Czasami może się przydać, jeśli chcesz skorzystać z funkcji formatowania przy użyciu
void info(String var1, Object... var2);
symbolu zastępczego „{}” - patrz metoda W tym przypadku powiedz, że masz ciąg znaków ze stosu, a następnie możesz zrobić coś takiego:Spowoduje to wypisanie sparametryzowanego komunikatu i śladu stosu na końcu w taki sam sposób, jak w przypadku metody:
logger.error("error: ", e);
Właściwie napisałem bibliotekę open source, która ma narzędzie do wyodrębniania śladu stosu jako ciąg znaków z opcją inteligentnego odfiltrowania szumu poza śladem stosu. To znaczy, jeśli określisz prefiks pakietu, który Cię interesuje, wyodrębniony ślad stosu zostanie odfiltrowany z niektórych nieistotnych części i pozostawi bardzo szczegółowe informacje. Oto link do artykułu, który wyjaśnia, jakie narzędzia ma biblioteka i skąd je zdobyć (zarówno jako artefakty mavena, jak i źródła git), a także jak z niego korzystać. Biblioteka Java Open Source z filtrowaniem śladów stosu, konwerterem Unicode Silent String i Porównanie wersji Zobacz akapit „ Filtr szumu stosu ”
źródło
Ta odpowiedź może nie być związana z zadanym pytaniem, ale z tytułem pytania.
LUB
LUB
źródło
W Log4j 2 można użyć Logger.catching (), aby zarejestrować ślad stosu z wychwyconego wyjątku.
źródło
byłoby to dobre rejestrowanie błędów / wyjątków log4j - do odczytu przez splunk / inne logowanie / monitorowanie s / w. wszystko jest formą pary klucz-wartość. log4j pobierze ślad stosu z Exception obj
e
źródło
źródło
Możesz użyć poniższego kodu:
Tutaj możesz po prostu zadzwonić:
LogWriterUtility.errorWithAnalysis( YOUR_EXCEPTION_INSTANCE);
Wyświetli stackTrace w twoim dzienniku.
źródło
Utwórz to
class
:Nazwij to w swoim kodzie
źródło