2015-07-14 2 views
5

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

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

+1

вкратце: НЕТ, u не может. – Bikku

+1

Конечно, используйте это: https://commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/apache/commons/lang3/exception/ExceptionUtils.html#getStackTrace(java.lang.Throwable) from commons-lang3 3.4 – EpicPandaForce

+0

Какое строковое значение будет «ничего» в? – user2864740

ответ

9

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

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

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

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

+0

Спасибо Saif Asif. Теперь я могу регистрировать всю трассировку стека. –

+2

'logger.error()' не 'java.util.logging', но я не собираюсь спускать вас вниз, потому что я рад узнать' logger.log (Уровень, Исключение, Поставщик) '. Похоже, что Oracle сделал «java.util.logging.Logger» серьезным уродством! С тех пор, как они это делали, странно, что они не воспринимали это дальше и создали «logger.severe (String, Exception)» и т. Д. – Adam

6

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

Возможно, вы хотите получить сообщение об исключении через ex.getMessage().

0

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

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

1

Вы можете использовать метод 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"); 
+1

Просто используйте библиотеку ExceptionUtils apache; нет необходимости изобретать велосипед – beresfordt

8

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

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

Спасибо. Этот метод работает отлично. –

+0

Я не получаю трассировку стека для регистрации с этим, только второй аргумент. –

+0

Можно отключить трассировку стека, изменив формат журнала. Какой форматтер вы используете и как выглядит ваш формат журнала? – hzpz

0

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

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

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

Вы можете сделать что-то вроде этого

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

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

LOGGER.log(Level.INFO, ex.getMessage(),ex); 
//ex is my exception object 
Смежные вопросы