Как зарегистрировать stacktrace с помощью класса Logger java

Я использую Java Logger класса. Я хочу пройти ex.printStackTrace() на Logger.log(loglevel, String), а printStackTrace() возвращает void. Поэтому я не могу передать и распечатать трассировку стека исключения.

есть ли способ, которым я могу конвертировать void на String, или есть какие-либо другие методы для печати всей трассировки стека исключений?

10 ответов


вы должны понять, что void на самом деле nothingness. Вы не можете обратить то, что есть ничто. Вы можете в конечном итоге печать void как строка, но (поверьте мне), вы этого не хотите.

Я думаю, что вы ищете

// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)

это напечатает сообщение об ошибке с помощью регистратора, который вы настроили. Для более подробной информации, вы можете взглянуть на документацию для исключение#getMessage ()


использовать java.util.logging.Logger#log(Level, String, Throwable) и передать ex в качестве третьего аргумента:

LOGGER.log(Level.INFO, ex.getMessage(), ex);

вы не можете преобразовать void на String; такого преобразования не существует. void не отвечает что-нибудь назад, поэтому у вас нет значения для извлечения.

что вы, вероятно, хотите сделать, это получить сообщение об исключении вместоex.getMessage().


также другой альтернативой будет:

log.error("Exception : "+ExceptionUtils.getFullStackTrace(e));

можно использовать getStackTrace() метод для получения массива StackTraceElements и генерации строки оттуда. В противном случае, если достаточно только окончательного сообщения об ошибке, используйте getMessage() метод, предложенный Макото.

чтобы получить трассировку стека, как String из массива StackTraceElement объекты, вам нужно перебрать массив (взятый из источника JDK7):

StringBuilder builder = new StringBuilder();
StackTraceElement[] trace = getOurStackTrace();
    for (StackTraceElement traceElement : trace)
        builder.append("\tat " + traceElement + "\n");

другой вариант-использовать printStackTrace(PrintStream s), где вы можете указать, где вы хотите stacktrace для печати:

ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");

Как говорит Макото, вы, вероятно, хотите сделать ex.метод GetMessage().

для дальнейшего уточнения, void означает, что ничего не возвращается. Вы не можете ничего бросить во что-то:)


вы можете преобразовать stacktrace в строку, используя ниже. Если e является объектом исключения

StringWriter stringWriter= new StringWriter();
PrintWriter printWriter= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTraceAsString= stringWriter.toString(); 

спасибо всем. Я могу регистрировать данные трассировки стека, используя

LOGGER.log(Level.INFO, ex.getMessage(),ex);
//ex is my exception object

существует перегруженный метод printStackTrace, который принимает PrintWriter.

вы можете сделать что-то подобное

Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());

с форматом ниже вы можете иметь трассировку стека:

java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n

точка в этом шаблоне - %6$s. Он напечатает трассировку стека.