Как зарегистрировать 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()
.
можно использовать 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. Он напечатает трассировку стека.