Ответ 1
Я буду использовать ExceptionUtils # getFullStackTrace jakarta commons lang
У меня есть общая функция, которая печатает исключения (используя log4j):
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause() + "\n" + e.getStackTrace().toString());
}
Вместо просмотра трассировки стека я вижу:
[Ljava.lang.StackTraceElement;@49af7e68
Как я могу правильно просмотреть трассировку стека исключения?
log.error(e) < - показывает ошибку, но не показывает трассировку стека
Я буду использовать ExceptionUtils # getFullStackTrace jakarta commons lang
В вашей системе ведения журнала должна быть возможность регистрировать исключения, поэтому достаточно просто выполнить исключение для правильного вызова .error(Object, Throwable)
:
java.util.logging
может сделать этоЕсли ваша инфраструктура ведения журнала не может этого сделать или вам нужна трассировка стека в String
по любой другой причине, тогда это становится немного сложнее. Вам нужно создать обертку PrintWriter
a StringWriter
и вызвать .printStackTrace()
на Exception
:
StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
Вы пробовали?
private void _showErrorMessage(Exception e) {
log.error("Hey! got an exception", e);
}
Throwable.getStackTrace
возвращает массив StackTraceElement
s, поэтому метод toString
возвращает текстовое представление самого массива.
Чтобы получить информацию о трассировке стека, вам нужно пройти через каждый StackTraceElement
, чтобы получить дополнительную информацию.
Вы также можете посмотреть библиотеки Guava от Google.
Throwables.getStackTraceAsString(Throwable throwable)
Точный ответ на ваш вопрос заключается в том, что вы должны вызвать Log4J следующим образом:
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e);
}
Хотя я обойдусь вызовом e.getCause(), потому что stacktrace даст вам это так, так:
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage(), e);
}
ExceptionUtils отлично подходит, если вам действительно нужна строка stacktrace, но поскольку вы используете Log4J, вы теряете много, не используя встроенную обработку исключений.
Исключение Stacktrace logging показывает два метода для этой цели: один на основе Apache Commons и другой, используя стандартный метод JDK.