Spring Boot Logging HTTP-запрос и ответ, а также запись журналов в базу данных SQL - PullRequest
0 голосов
/ 08 мая 2020

Я разработал простую оболочку REST JSON для publi c SOAP веб-сервиса . Веб-сервис предназначен для простого калькулятора с 4 методами: сложение, деление, умножение и вычитание.

Обертка REST работает нормально. Моя следующая цель - регистрировать каждый запрос и ответ между оболочкой REST и веб-службой SOAP, а затем записывать записи журнала в базу данных SQL.

У меня две основные проблемы с выполнением задачи.

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

  2. В целях тестирования попытались сгенерировать и записать записи журнала в базу данных SQL с помощью DBAppender, но DBAppender генерирует 3 таблицы. Но я хочу вести журналы в пользовательские таблицы.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Популярным подходом для регистрации запросов и ответов является использование spring-aop. Однако не рекомендуется выполнять операции, требующие высокой производительности, на spring-aop. Это пример использования spring-aop в вашем случае использования. Однако вместо того, чтобы каждый раз опрашивать БД для журнала запросов или ответов, лучше найти способ обрабатывать журналы пакетами, чтобы избежать накладных расходов на доступ к БД.

Добавьте spring-boot-starter-aop зависимость

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

Включить AspectJAutoproxy для приложения пружины

@SpringBootApplication( )
@EnableAspectJAutoProxy( proxyTargetClass = true )
public class Application
{
    public static void main( String[] args )
    {
        SpringApplication.run( Application.class, args );
    }
}

Добавить класс аспекта

@Aspect
@Component
public class CalculatorAspect
{
    private Logger LOGGER = Logger.getLogger( getClass().getName() );

    @Around( "execution(* com.example.Calculator.add(..))" ) // Add method
    public Object logInfoAboutAddOperation( ProceedingJoinPoint joinPoint ) throws Throwable
    {
        // Log here for request using joinPoint variable information
        // and add the necessary entries to DB
        Object proceed = joinPoint.proceed(); // This instructs the target to proceed with method execution which is the add() method
        // Log here for response and add the necessary info to DB

        return proceed; // This is mandatory and this contains the result of add() method. You can even change the actual result here
    }
}

Это можно сделать различными способами в соответствии с вашими требованиями. Пожалуйста, посмотрите эту ссылку для получения дополнительной информации о spring-aop. Используя соответствующий Advice, вы также можете регистрировать запросы и ответы на уровне Controller.

0 голосов
/ 09 мая 2020

В дополнение к ответу Клауса я хотел бы добавить, что вы можете получить доступ к pointcut (методам, которые вы хотите перехватить), используя пользовательскую аннотацию.

Таким образом, вы можете определить свою аннотацию вот так:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogCallToDB {
}

Затем вы можете определить аспект вокруг этой аннотации:

@Aspect
@Component
@Slf4j
public class LoggingToDBAspect {

@Around("@annotation(com.myltdcompany.myproject.infra.utils.LogCallToDB)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {

    Object proceed = joinPoint.proceed();

    final Signature signature = joinPoint.getSignature();
    Object[] args = joinPoint.getArgs();

    // write to DB using some wrapper like CallLoggingRepository

    return proceed;
}

И тогда вы можете просто использовать аннотацию @LogCallToDB поверх любого метода, для которого вы хотите для записи в БД. Пример:

@LogCallToDB
public doubl add(double a, double b) {
  return a+b;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...