Как я могу logtrace использовать java Logger class
Я использую класс Java Logger
. Я хочу передать ex.printStackTrace()
в Logger.log(loglevel, String)
, но printStackTrace()
возвращает void
. Поэтому я не могу передать и распечатать трассировку стека исключения.
Есть ли способ конвертировать void
в String
, или есть ли какие-либо другие методы для печати целых трассировок исключений?
Ответы
Ответ 1
Вам нужно понять, что void
на самом деле nothingness
. Вы не можете преобразовать то, что ничего. Вы можете завершить печать void
как строку, но (поверьте мне), вы этого не хотите.
Я думаю, что вы ищете
// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)
Это приведет к выводу сообщения об ошибке с помощью настроенного вами регистратора. Для более подробной информации вы можете взглянуть на документы java для Исключение # getMessage()
Ответ 2
Используйте java.util.logging.Logger#log(Level, String, Throwable)
и перейдите в ex
в качестве третьего аргумента, подобного этому:
LOGGER.log(Level.INFO, ex.getMessage(), ex);
Ответ 3
Также другой альтернативой будет:
import org.apache.commons.lang3.exception.ExceptionUtils;
log.error("Exception : "+ExceptionUtils.getStackTrace(exception));
Ответ 4
Вы не можете преобразовать void
в String
; такой конверсии не существует. void
ничего не возвращает, поэтому вы не можете получить значение.
То, что вы, вероятно, хотите сделать, это получить сообщение исключения вместо ex.getMessage()
.
Ответ 5
Вы можете использовать метод getStackTrace(), чтобы получить массив StackTraceElements и сгенерировать String. В противном случае, если достаточно только окончательного сообщения об ошибке, используйте метод getMessage()
, предложенный Макото.
Чтобы получить трассировку стека как String
из массива объектов StackTraceElement
, вам необходимо выполнить итерацию по массиву (взятую из источника JDK7):
StringBuilder builder = new StringBuilder();
StackTraceElement[] trace = getOurStackTrace();
for (StackTraceElement traceElement : trace)
builder.append("\tat " + traceElement + "\n");
Другой вариант - использовать printStackTrace(PrintStream s)
, где вы можете указать, где вы хотите напечатать стек:
ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");
Ответ 6
Как говорит Макото, вы, вероятно, захотите сделать ex.getMessage().
Чтобы уточнить, void
означает, что ничего не возвращается. Вы не можете ничего не использовать:)
Ответ 7
вы можете преобразовать stacktrace в String, используя ниже. Если e
является объектом исключения
StringWriter stringWriter= new StringWriter();
PrintWriter printWriter= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTraceAsString= stringWriter.toString();
Ответ 8
Там есть перегруженный метод printStackTrace, который использует PrintWriter.
Вы можете сделать что-то вроде этого
Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());
Ответ 9
Спасибо всем. Я могу зарегистрировать данные трассировки стека, используя
LOGGER.log(Level.INFO, ex.getMessage(),ex);
//ex is my exception object
Ответ 10
С форматом ниже вы можете иметь трассировку стека:
java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n
Точка в этом шаблоне -% 6 $ s. Он напечатает трассировку стека.