Одна из часто встречающихся задач при разработке 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); } }
Подход с использованием фильтров и обработчиков исключений позволяет единообразно логировать информацию о всех запросах и ответах, а также обрабатывать исключения в одном месте.
Добавить комментарий