Spring Boot и JSON-логирование: добавляем пользователя и сессию без боли

Разбираемся, как прикрутить к логам Spring Boot данные о пользователе и сессии — и не сойти с ума от парсинга.
Логи — это как чёрный ящик самолёта: пока всё хорошо, ты про них не вспоминаешь, а когда баг на проде — копаешься в сотнях строк в поисках иголки. Spring Boot по умолчанию пишет логи в текстовом формате, что удобно для чтения человеком, но ад для машинного анализа.
JSON-логирование: спасательный круг для разработчика
Переход на JSON-формат — это как заменить мятую бумажку с пометками на структурированную таблицу. В видео показывают, как настроить Logback или Log4j2, чтобы логи превратились в аккуратные JSON-объекты с полями: timestamp, level, message, и, самое главное, — user и session.
Зачем это нужно? Представьте: на проде пользователь жалуется, что у него что-то сломалось. Вы лезете в логи, но видите только кучу одинаковых сообщений от разных юзеров. Без контекста — гадай на кофейной гуще. А если в каждом логе есть userId и sessionId, вы за секунду фильтруете по нужному пользователю и видите всю цепочку его действий. Магия, да и только.
Как добавить пользователя и сессию в логи?
Самый простой способ — использовать MDC (Mapped Diagnostic Context). Это такой карман в логирующем фреймворке, куда можно положить любые данные, и они автоматически попадут в каждый лог из текущего потока. В Spring Boot это делается через фильтр или интерцептор:
- Создаёте фильтр, который перед обработкой запроса кладёт в MDC userId и sessionId из SecurityContext или HTTP-сессии.
- Настраиваете layout логгера на JSON-формат, указав, что нужно вытаскивать эти поля из MDC.
- Готово — каждый лог теперь содержит контекст.
Кстати, не забудьте очищать MDC после запроса, иначе данные утекут в соседний поток — будет весёлый баг, когда один пользователь видит логи другого.
Комментарий студии METABYTE: Мы тоже не раз обжигались на текстовых логах, пока не внедрили JSON-формат. Теперь поиск багов стал похож на игру «найди кота» — только кота вы точно найдёте, а не будете гадать, есть ли он вообще.