Логирование
Что делал на практике
- настраивал прикладное логирование для backend-сервисов и API;
- разделял каналы логирования по назначению;
- вводил структурированный контекст в логах;
- настраивал ротацию и сроки хранения логов;
- добавлял корреляционные идентификаторы запросов (
trace_id); - проектировал логирование фоновых задач и служебных процессов;
- подключал инструменты локальной отладки и централизованного сбора логов.
Прикладное логирование API
Для API настраивал отдельный лог-канал и middleware, которое централизованно фиксирует:
- начало и завершение запроса;
- HTTP-метод, маршрут, статус ответа;
- длительность выполнения;
- контекст пользователя;
- ошибки и исключения;
- служебный request context для поиска инцидентов.
Trace ID и корреляция событий
Использовал trace_id для связки:
- входящего HTTP-запроса;
- логов middleware, контроллеров и exception handling;
- фоновых и асинхронных операций, если они продолжают пользовательский сценарий.
trace_id добавлялся в лог-контекст и возвращался клиенту в HTTP-ответе.
Разделение лог-каналов
Разделял логирование по каналам, чтобы разные типы событий не смешивались в один поток:
- отдельный канал для API;
- отдельные каналы для HTTP/служебного трафика;
- отдельные каналы для очередей и фоновых задач;
- отдельные каналы для специализированных процессов, например генерации файлов или экспорта.
На практике это видно по наличию отдельных daily-каналов для api, http, queue, pdf_export и общего application logging.
Структурированный контекст
Использовал структурированный контекст в логах:
user_id;- маршрут и путь запроса;
- статус ответа;
- длительность выполнения;
- технические идентификаторы;
- служебные параметры бизнес-операции.
Уровни логирования и дисциплина
Использовал уровни логирования по PSR-3:
infoдля нормальных прикладных событий;noticeдля значимых, но ожидаемых отклонений;warningдля проблемных ситуаций без аварии;error/criticalдля сбоев и исключений.
Логирование фоновых задач
Отдельно настраивал логирование фоновых процессов:
- очередей;
- jobs;
- экспорта файлов;
- асинхронных операций;
- технических процессов вокруг генерации артефактов.
Исключения и проблемные сценарии
Для ошибок и исключений обычно закладывал:
- логировать исключения с контекстом;
- не терять request/user context;
- различать ожидаемые бизнес-ошибки и технические сбои;
- не писать в лог чувствительные данные;
- делать формат ошибок пригодным для связи с API-ответами.
Локальная отладка
Подключал логирование к локальным инструментам отладки:
- подключение
Buggregator; - отправка логов в socket handler;
- использование JSON formatter для внешних обработчиков;
- раздельное включение/отключение debug-инструментов через env-конфиг.
Централизованный сбор логов
Подключал централизованный лог-стек:
Promtailкак агент чтения логов;Lokiкак хранилище;Grafanaдля поиска и визуализации.
Под это выделял отдельный compose-стек, где:
- приложение пишет логи в
storage/logs; Promtailсчитывает эти логи;Lokiхранит поток событий;Grafanaиспользуется для поиска и анализа.