Как собирать и анализировать логи в production?
Принцип production-логирования: приложение пишет логи в stdout (JSON), инфраструктура собирает и доставляет их в систему агрегации для поиска, визуализации и алертинга.
Популярные стеки агрегации логов
| Стек | Компоненты | Особенности |
|---|---|---|
| ELK | Elasticsearch + Logstash + Kibana | Мощный полнотекстовый поиск, высокое потребление ресурсов |
| Grafana Loki | Promtail + Loki + Grafana | Легковесный, индексирует только метки, дешевле ELK |
| Cloud-native | CloudWatch (AWS) / Cloud Logging (GCP) / Azure Monitor | Минимальная настройка, vendor lock-in |
Архитектура сбора логов
Пример
ELK: Приложение -> stdout (JSON) -> Filebeat/Logstash -> Elasticsearch -> Kibana (UI)
Loki: Приложение -> stdout (JSON) -> Promtail -> Loki -> Grafana (UI)
Cloud: Приложение -> stdout -> CloudWatch / Cloud Logging / Azure Monitor
Логирование в Kubernetes
В Kubernetes стандартный подход — вывод логов в stdout:
- Приложение пишет в stdout — kubelet собирает автоматически
- Доступ через
kubectl logsдля быстрой диагностики - Для агрегации: DaemonSet с Promtail/Fluentd на каждой ноде читает
/var/log/containers/*.logи отправляет в систему агрегации
Файловое логирование внутри контейнера — антипаттерн: при рестарте пода файлы теряются.
Correlation ID для distributed tracing
В микросервисной архитектуре один запрос проходит через несколько сервисов. Для связывания логов используется correlation ID:
Пример
// Заголовок X-Request-ID проходит через все микросервисы
// Каждый сервис добавляет его в MDC -> в логи -> в систему агрегации
// В Kibana/Grafana: фильтр по requestId показывает путь запроса через все сервисы
Spring Boot 3.x + Micrometer Tracing автоматизирует этот процесс:
- Генерирует traceId и spanId
- Пробрасывает через HTTP-заголовки (W3C Trace Context)
- Добавляет в MDC, откуда попадает в логи
Retention policy
Определите сроки хранения для разных уровней:
| Уровень | Рекомендуемый срок хранения |
|---|---|
| DEBUG/TRACE | 3-7 дней (если вообще включены) |
| INFO | 30-90 дней |
| WARN | 90 дней |
| ERROR | 1 год |
Частые ошибки
- Логи в файлы внутри контейнера — при рестарте пода файлы теряются; пишите в stdout
- Отсутствие retention policy — логи растут бесконечно, Elasticsearch потребляет терабайты
- Нет алертинга на ERROR — логи собираются, но никто не настроил уведомления
- Отсутствие correlation ID — невозможно проследить путь запроса через микросервисы
Как используется в 2026
- Grafana Loki вытесняет ELK для многих проектов (проще, дешевле)
- OpenTelemetry унифицирует логи, метрики и трейсы в единый стандарт
- Spring Boot 3.x + Micrometer — автоматическая интеграция с Grafana/Prometheus/Tempo
На собеседовании: ключевые темы — stdout в Kubernetes (не файлы), structured JSON для машинного парсинга, correlation ID для distributed tracing. Частая ошибка — описать только ELK, не упомянув Loki и OpenTelemetry как современные альтернативы.