Ответ
Я строю логирование на основе принципа structured logging (структурированное логирование) для эффективного сбора и анализа.
Стек и инструменты:
- Сбор и агрегация: Fluentd / Vector как log forwarder, отправляющий логи в центральное хранилище.
- Хранилище: Elasticsearch (в связке ELK) или Grafana Loki для более легковесного варианта.
- Визуализация и поиск: Kibana или Grafana.
- Трейсинг: Jaeger или Grafana Tempo для распределенной трассировки.
Практики и конфигурация:
- Уровни логирования: Использую стандартные уровни (DEBUG, INFO, WARN, ERROR). В продакшене по умолчанию INFO, DEBUG включается только для конкретных проблемных сервисов.
- Структурированный формат (JSON): Каждая запись лога — это JSON-объект с полями для машинного парсинга.
{ "timestamp": "2023-10-05T14:30:00Z", "level": "ERROR", "service": "payment-service", "trace_id": "abc123", "message": "Failed to process payment", "error": "Connection timeout to PSP", "user_id": "user_456", "order_id": "order_789" } - Контекст и корреляция: Все логи в рамках одного HTTP-запроса или бизнес-процесса содержат общий
trace_idилиrequest_id. Это позволяет в Loki или Kibana восстановить полную цепочку событий по одному ID. - Ротация и retention: Настраиваю log rotation на узлах (через logrotate) и политики хранения в Elasticsearch/Loki (например, удалять логи старше 30 дней).
Такой подход позволяет быстро находить root cause проблем, анализировать поведение системы и строить дашборды для ключевых метрик.
Ответ 18+ 🔞
Слушай, я тут настраиваю логирование, а то без него как слепой кот — нихуя не видно, что в системе творится. Решил замутить structured logging, это когда логи не просто текст, а нормальные структурированные данные, чтобы их машина могла легко жрать и анализировать. Ёпта, раньше гребаные логи парсить — это был пиздец, а теперь красота.
Чем буду пользоваться, чтоб не вышло говно:
- Сборщик и пересылка: Беру Fluentd или Vector. Это такие ребята, которые будут собирать логи со всех сервисов и аккуратно пихать их дальше. Без них — терпения ноль ебать, самому везде бегать.
- Хранилище: Тут два пути. Либо Elasticsearch в классической связке ELK — мощно, но жрёт ресурсов овердохуища. Либо Grafana Loki — полегче, специально под логи заточена, мне сейчас больше нравится.
- Чтоб смотреть: Для Elasticsearch — Kibana, для Loki — Grafana. Там искать, строить графики, дашборды всякие. Без визуализации это просто куча текста, в рот меня чих-пых.
- Трассировка: Отдельно для распределенных трейсов — Jaeger или Grafana Tempo. Чтобы если запрос по пяти сервисам прошел, можно было всю цепочку, как на ладони, развернуть.
Как именно делаю, чтоб не было распиздяйства:
- Уровни. Использую стандартные: DEBUG, INFO, WARN, ERROR. В продакшене обычно стоит INFO, а DEBUG включаю только для конкретного сервиса, который глючит. Иначе отладочных логов будет — хуй с горы, засрут всё.
- Структура — главное! Каждая строчка лога — это JSON. Не просто «ой, ошибка», а нормальный объект.
{ "timestamp": "2023-10-05T14:30:00Z", "level": "ERROR", "service": "payment-service", "trace_id": "abc123", "message": "Failed to process payment", "error": "Connection timeout to PSP", "user_id": "user_456", "order_id": "order_789" }Видишь? Есть
trace_id, естьuser_id. Теперь можно не гадать, а искать по полям. Красота, ёпта. - Связывание событий. Самый важный пункт, блядь. Весь код, который работает в рамках одного запроса, должен добавлять в логи один и тот же
trace_idилиrequest_id. Потом в Kibana или Loki вбиваешь этот ID — и тебе вываливается ВСЁ, что происходило с этим запросом в каждом микросервисе. Волнение ебать, как удобно! Раньше бы час рылся, а теперь за пять секунд root cause находишь. - Уборка за собой. Обязательно настраиваю rotation логов на самих серверах (старый добрый logrotate), и задаю политики хранения в Elasticsearch или Loki. Типа «храним 30 дней, потом нахуй удаляем». А то диск забьётся — будет тебе хиросима, а не логи.
В общем, такая схема превращает логи из кучи мусора в реальный инструмент. Проблемы искать в разы быстрее, можно даже дашборды для мониторинга бизнес-метрик нарисовать. Главное — не лениться и сразу писать структурированно, а не как попало.