Log4j2: трассировка стека журналов без исключения

Я использую Log4j2, какую-то бета-версию или около того.

Легко записать трассировку стека, когда у вас есть исключение:

} catch (Exception ex) {
  log.error("Doing stuff went wrong", ex);
}

Предположим, хотя нет Throwable объект доступен - я только что понял, что есть проблема и хочу записать ошибку:

 if (stuffIsWrong()) {
   log.error("Stuff went wrong");
 }

Как я могу сказать Log4j2 записывать трассировку стека, начиная с текущего метода?

3 ответа

Решение

Просто создайте новое исключение

if (stuffIsWrong()) {
    log.error("Stuff went wrong", new Exception("Stracktracegenerator"));
}

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

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}

просто проверьте свое состояние и, если оно соответствует, напечатайте трассировку стека в журналах

У меня была похожая потребность в трассировке стека, хотя ничего не "пошло не так". Я понимаю ваше нежелание использовать исключение, хотя ничего не пошло не так.

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

Чтобы отделить эту трассировку стека от "реальных" исключений, я создал класс, расширяющий Exception, который называется NoProblemJustShowingStackTrace, но любое имя, которое проясняет ваше намерение, будет в порядке. Хорошее имя немного помогает, но как разработчики мы так привыкли видеть трассировку стека только тогда, когда выдается / ловится "реальное" исключение, которое все равно будет вводить в заблуждение людей, читающих журнал. Лучше всего удалить этот код, как только временная проблема решена.

Обратите внимание, что вы не throw это исключение, все что вы делаете, это создаете объект и передаете его методу logger.


Более постоянное альтернативное решение - использовать макет шаблона с информацией о местоположении, например, %location, %line, % file, % class,% method. Обратите внимание, что это будет иметь большое влияние на производительность.

Другие вопросы по тегам