Как вы записываете полную трассировку стека в журнал?
Я ловил исключение и пытался записать трассировку стека в журналы следующим образом:
log.warn(e.getMessage());
но все, что он сказал, было
null
поэтому я изменил его, чтобы
log.warn(e.toString());
и теперь он говорит только
java.lang.NullPointerException
как записать полную трассировку стека в журнал, чтобы увидеть, где это исключение генерируется в приложении?
7 ответов
можно использовать
logger.log(Level.WARN, "logged exception", ex);
или
logger.warn("logged exception", ex);
ресурсы :
в вашем методе исключения, лежащие в основе String
который содержит сообщение null
.
вышеприведенный ответ, теперь вычеркнутый, все еще держится, кроме того, что e
не равно null, но detailMessage
переменная частного экземпляра на Throwable
класс равен null, поэтому e.getMessage()
строка null
, а e.toString()
(который вызывает underlying null detailMessage.toString
) бросает!--9-->.
используя log4j, это делается с помощью:
регистратор.ошибка ("произошла ошибка", исключение); Первый аргумент-это сообщение для отображения, второй-исключение (throwable), stacktrace которого регистрируется.
другой вариант-commons-logging, где это то же самое:
log.ошибка ("Сообщение", исключение);
с java.утиль.регистрация это можно сделать через:
регистратор.уровень журнала.Тяжелый, "сообщение", исключение);
Если вы используете java8, вы можете сделать следующее:
LOGGER.error("Caught exception while methodX. Please investigate: "
+ exception
+ Arrays.asList(exception.getStackTrace())
.stream()
.map(Objects::toString)
.collect(Collectors.joining("\n"))
);
может быть, вы ищете что-то вроде этого: http://www.javapractices.com/topic/TopicAction.do?Id=78
Если вы используете версию Java до 8, вы можете попробовать следующее:
LOGGER.error("Error al recuperar proveedores de la base de datos: " +
e + Arrays.asList(e.getStackTrace()).stream().map(new Function(){
@Override
public Object apply(Object t) {
return t.toString();
}
}).collect(Collectors.joining("\n")));