Как я могу 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. Он напечатает трассировку стека.