Есть ли способ проверить, какой метод API / контроллера привел к текущей точке выполнения в приложении Spring Boot во время выполнения? - PullRequest
0 голосов
/ 26 июня 2019

По сути, я реализую некоторые динамические журналы в моем Spring Boot App, и мне нужно регистрировать исключения, помещенные в слой Service, в зависимости от того, какой вызов API привел к возникновению исключения во время выполнения метода где-то внизу на уровне Service.,Я хочу знать, могу ли я проверить в этом методе, какой API привел нас к текущей точке выполнения?

Мне известно, что я могу использовать трассировку стека, чтобы по существу отследить до конкретного метода Controller, который привел к текущей точке выполнения, однако это связано с некачественным кодом, где я активно проверяю,StackTraceElement содержит «.controller» в качестве подстроки.Кроме того, трассировка стека может быть очень длинной, если задействована рекурсия, что ведет к неэффективности.Есть ли альтернативы?или можно сделать этот подход более эффективным / более чистым?

Контроллер:

@PostMapping(value = "/apiOne")
    public Response exchangeApi1(){
    ....
    someService.doMethod(params);
    ....
}

 @PostMapping(value = "/apiTwo")
        public Response exchangeApiTwo(){
        ....
        someService.doMethod(params);
        ....
}

Сервисный уровень:

@Service
public class SomeService {
....
   public void doMethod(params){
      ....
      String api = getCallingAPI()//I need this method. Does such a thing exist in native Spring libraries?

      switch (api) {
      case "apiOne":
        LOG.error(Alert Level 1);
        break;
      case "apiTwo":
        LOG.error(Alert Level 3);
        break;
      throw BusinessException();
    .....
  }
 ......
}

Мне нужно что-то, что по существу будет работать как getCallingAPI() в приведенном выше фрагменте.

РЕДАКТИРОВАТЬ: я понимаю, что я могу передать имя API в качестве параметра, но я забыл упомянуть, что doMethod () / исключение может быть несколько служебных слоев внизи имя API будет по существу бесполезным для многих методов, которые в конечном итоге приводят к выполнению doMethod / везде, где выдается исключение.Мне нужно что-нибудь чище.

1 Ответ

1 голос
/ 26 июня 2019

Одной из возможностей является использование MDC (сопоставленный диагностический контекст) вашей системы ведения журналов (например, slf4j / logback). MDC хранит данные для каждого потока, поэтому для каждого пользовательского запроса это простой способ хранения контекстной информации.

В момент вызова вашего API вы можете установить необходимую информацию в контексте и очистить ее от MDC, прежде чем покинуть метод.

import org.slf4j.MDC;

...

@PostMapping(value = "/apiOne")
public Response exchangeApi1() {
    MDC.put("api", "exchangeApi1");
    ....
    someService.doMethod(params);
    ....
    MDC.remove("api");
}

Лучшим и более чистым способом могло бы быть выделение этого поведения в аспект или фильтр сервлетов для уменьшения шаблона.

В вашем doMethod () вы можете получить доступ к информации API с помощью простого:

MDC.get("api");

Чтобы включить информацию MDC в свой вывод журнала, вы можете соответствующим образом настроить свои приложения. Пример для входа в систему можно найти в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...