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. Обратите внимание, что это будет иметь большое влияние на производительность.