Как вы записываете полную трассировку стека в журнал?

Я ловил исключение и пытался записать трассировку стека в журналы следующим образом:

log.warn(e.getMessage());

но все, что он сказал, было

null

поэтому я изменил его, чтобы

log.warn(e.toString());

и теперь он говорит только

java.lang.NullPointerException

как записать полную трассировку стека в журнал, чтобы увидеть, где это исключение генерируется в приложении?

7 ответов


обычно:

log.warn("message", e);

но это зависит и от вашей структуры ведения журнала.


можно использовать

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")));