JavaRush /Курсы /Модуль 5. Spring /Логирование запросов и ответов в REST API

Логирование запросов и ответов в REST API

Модуль 5. Spring
8 уровень , 9 лекция
Открыта

Логирование гораздо важнее, чем может показаться на первый взгляд неопытному разработчику.

Логи сродни "черному ящику" приложения, который записывает каждое его действие.

Они помогают:

  • Отслеживать входящие запросы и их параметры.
  • Узнавать, что именно произошло внутри приложения.
  • Выявлять ошибки и их причины.
  • Понимать, как работает приложение под нагрузкой.
  • Делать отладку быстрее и проще.

На реальных проектах REST API часто взаимодействуют со множеством клиентских приложений. Логи помогают не только разработчикам, но и DevOps-инженерам и системным администраторам разобраться, где и что пошло не так.


Логирование в Spring Boot

В Spring Boot за логирование отвечает Logback (по умолчанию). Это мощный и гибкий фреймворк для ведения логов. Он поддерживает разные уровни логирования, форматирования и даже отправку логов в удалённые системы.

Уровни логирования

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

  • TRACE — самый подробный уровень. Это как микроскоп для кода, показывающий каждую мелочь. В продакшене обычно отключен, чтобы не засорять логи.
  • DEBUG — ваш верный помощник при разработке. Записывает все интересные моменты, которые помогают понять, что происходит внутри приложения.
  • INFO — основной рабочий уровень. Фиксирует важные события в жизни приложения: "Сервер запустился", "База данных подключена", "Получен важный запрос".
  • WARN — предупреждения о потенциальных проблемах. Как желтый сигнал светофора — пока не критично, но стоит обратить внимание.
  • ERROR — красный сигнал тревоги. Что-то пошло совсем не так, и требуется срочное вмешательство. Логирует серьезные ошибки, которые мешают нормальной работе.

Конфигурация логирования в Spring Boot

Spring Boot предоставляет автоматическую интеграцию с Logback, и настройки логирования можно задать через файл application.properties или application.yml. Например, чтобы включить подробный отладочный режим (DEBUG), достаточно добавить строку:


logging.level.root=DEBUG

Основные инструменты для логирования запросов и ответов

В Spring Boot есть несколько способов логировать запросы и ответы. Мы рассмотрим три основных подхода:

  1. Логирование через фильтры (Filters).
  2. Логирование с использованием аспектов (AOP).
  3. Интеграция с фреймворками для централизованного логирования.

1. Логирование через фильтры

Фильтры (Filters) позволяют перехватывать HTTP-запросы и ответы на самом низком уровне перед их обработкой в контроллерах. Это простой способ логировать входящие запросы и ответы в одном месте.

Создадим свой фильтр для логирования:


import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class RequestResponseLoggingFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(RequestResponseLoggingFilter.class);

    @Override
    public void doFilter(jakarta.servlet.ServletRequest request, jakarta.servlet.ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // Логируем входящий запрос
        logger.info("Incoming request: method = {}, URI = {}", httpRequest.getMethod(), httpRequest.getRequestURI());

        // Продолжаем выполнение цепочки фильтров
        chain.doFilter(request, response);

        // Логируем исходящий ответ
        logger.info("Outgoing response: status = {}", httpResponse.getStatus());
    }
}

Разбираем код:

  1. Этот фильтр перехватывает все HTTP-запросы и ответы.
  2. Мы используем метод logger.info для записи входящих запросов (метод запроса и URI) и исходящего ответа (HTTP-статус).
  3. С помощью вызова chain.doFilter мы передаём управление дальше по цепочке.

2. Логирование с использованием AOP

AOP (Aspect-Oriented Programming) делает логирование по-настоящему умным и гибким. Это как установить автоматическую систему наблюдения, которая включается только в нужных местах и в нужное время.

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

Вот пример аспекта:


import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    // Логируем до выполнения метода контроллера
    @Before("execution(* com.example.demo.controller.*.*(..))")
    public void logBeforeEachRequest() {
        logger.info("A method in controller is about to be called...");
    }

    // Логируем после успешного выполнения метода контроллера
    @AfterReturning("execution(* com.example.demo.controller.*.*(..))")
    public void logAfterEachRequest() {
        logger.info("A method in controller has been completed successfully.");
    }
}
  1. Аннотация @Aspect указывает, что это аспект.
  2. С помощью выражений внутри @Before и @AfterReturning мы определяем, каким методам будет применён логгинг. Например, мы логируем все методы в пакетe com.example.demo.controller.
  3. В методах logBeforeEachRequest и logAfterEachRequest мы используем логирование INFO, чтобы записать сообщение до и после вызова метода.

3. Централизованное логирование (опционально)

Если ваше приложение работает в распределённой системе, то классическое логирование может быть трудным для анализа. В таких случаях используются системы централизованного логирования (например, ELK Stack: Elasticsearch, Logstash, и Kibana).

Пример конфигурации для отправки логов в Elasticsearch через Logback:

logback-spring.xml


<configuration>
    <appender name="ELASTICSEARCH-APPENDER" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>

    <root level="info">
        <appender-ref ref="ELASTICSEARCH-APPENDER"/>
    </root>
</configuration>

Этот фрагмент отправляет все логи уровня INFO и выше в Logstash, который затем передаёт их в Elasticsearch. Таким образом, логи можно визуализировать в Kibana.


Практическое применение

1. Какой метод выбрать?

  • Фильтры, если вам нужно логировать все запросы и ответы в одном месте.
  • AOP, если необходимо логировать только специфические методы (например, методы контроллеров).
  • Централизованное логирование актуально для продакшн-среды, особенно если у вас несколько микросервисов.

2. Типичные ошибки

  • Чрезмерное логирование: записывать всё подряд — это не всегда хорошая идея. Логи могут стать шумом. Логируйте только ту информацию, которая действительно нужна.
  • Логирование конфиденциальных данных: никогда не логируйте пароли, токены или другие чувствительные данные.
  • Неправильный уровень логирования: например, использование ERROR для обычной бизнес-логики — это анти-паттерн.

3. Что пригодится на собеседовании?

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


Теперь вы знаете, как внедрить логирование в REST API. Оно не только помогает обрабатывать ошибки, но и прекрасно демонстрирует все «внутренности» приложения. Логи — это ваши глаза и уши.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ