Есть ли способ передать StackTraceElement в какой-либо среде ведения журналов для Java?

Я реализую приложение с библиотекой Jsch от JCraft, которая является реализацией Java для ssh.

Эта библиотека имеет интерфейс Logger, который описывает функцию журнала следующим образом.

public void log(int level, String message);

Есть ли способ реализовать это с чем-то вроде этого?

public void log(int level, String message)
{
    StackTraceElement trace = getTrace();
    LOGGER.log( trace, level, message);
}

См. также stackoverflow.com/questions/42534564/…

Raedwald 16.04.2019 11:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вместо того, чтобы передавать трассировку стека, вы можете передать исключение, и структура ведения журнала распечатает трассировку стека. Это возможно с помощью интерфейса SLF4JLogger и фреймворков журналирования, таких как logback, которые ему соответствуют.

Нет обработки исключений. Просто обычные сообщения регистрации

Stathis Alexopoulos 16.04.2019 09:26

Из текущего потока вы можете запросить всю трассировку стека, и если не учитывать текущую позицию [0], у вас будет место вызова log вхождения.

public void log(int level, String message) {
    StackTraceElement trace = Thread.currentThread().getStackTrace()[1]; // Or 2?
    LOGGER.log(trace, level, message);
}

Поскольку в настоящее время исключения часто объединяются в цепочку (выбрасываются как причина), я не уверен, достаточно ли одного элемента трассировки стека.

Я знаю механизм StackTraceElement. Я не знаю, как передать информацию о какой-либо структуре ведения журнала, например, о SLF4J, как предложил Raedwald.

Stathis Alexopoulos 16.04.2019 09:27
Ответ принят как подходящий

Если предполагается, что getTrace() возвращает сайт вызова оператора регистратора, вы можете создать новый Throwable и преобразовать трассировку стека в строку или выбрать один кадр и преобразовать его в строку. Получив строковое представление трассировки, вы можете соединить его со строкой сообщения и отправить в целевую структуру ведения журнала.

Если ваша структура ведения журналов поддерживает Сопоставленный диагностический контекст, вы можете передать объект throwable или сам элемент трассировки стека в структуру ведения журналов. Если вы используете JUL, вам просто нужно использовать метод Logger::logp для передачи информации о месте вызова.

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