Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
10 Июл 2023
2 мин
1250

Логирование всех запросов и ответов с исключениями в Spring Boot

Одна из часто встречающихся задач при разработке REST API на Spring Boot — это логирование всех входящих запросов и исходящих ответов, включая информацию

Одна из часто встречающихся задач при разработке REST API на Spring Boot — это логирование всех входящих запросов и исходящих ответов, включая информацию об исключениях. Это может быть полезно для отладки, мониторинга и анализа поведения приложения.

Представьте себе ситуацию: приложение получает запрос (например, GET-запрос на URL «http://example.com/api/users/1») и отправляет ответ (например, информацию о пользователе с id = 1). Вам необходимо зафиксировать все детали этого взаимодействия, включая HTTP-метод, путь запроса, строку запроса, соответствующий метод класса, а также ответ и любые возникшие исключения.

Также возможна ситуация, когда приложение получает запрос на несуществующего пользователя (например, «http://example.com/api/users/9999»). В этом случае вы хотите записать информацию об ошибке, включая HTTP-статус, код ошибки и исключение.

Во всех этих сценариях информация о запросе и ответе должна быть логирована в одном месте, чтобы обеспечить простоту анализа.

В Spring Boot для логирования запросов и ответов можно использовать фильтры. Фильтр — это компонент, который может быть использован для предварительной и постобработки HTTP-запросов.

Ниже приведен пример фильтра, который записывает детали запроса и ответа:

@Component
public class LoggingFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        long startTime = System.currentTimeMillis();

        // Продолжить обработку запроса
        filterChain.doFilter(request, response);

        long duration = System.currentTimeMillis() - startTime;

        // Создание записи лога
        String logMessage = String.format("request method: %s, request URI: %s, response status: %d, request processing time: %d ms",
                request.getMethod(), request.getRequestURI(), response.getStatus(), duration);

        // Запись лога
        logger.info(logMessage);
    }
}

Для обработки исключений можно использовать механизм обработки исключений Spring с помощью аннотаций @ControllerAdvice и @ExceptionHandler. Это позволяет централизованно обрабатывать исключения на уровне всего приложения.

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleAllExceptions(Exception ex, WebRequest request) {
        // Создание записи лога
        String logMessage = String.format("Exception: %s, message: %s, request: %s",
                ex.getClass().getName(), ex.getMessage(), request.getDescription(false));

        // Запись лога
        logger.error(logMessage, ex);

        // Возврат ответа с описанием ошибки
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

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

Добавить комментарий

Подарок
Забрать подарок