Структурированные логи

Тема дорожной карты · Loki

Структурированные логи — это записи логов в машиночитаемом формате, таком как JSON или logfmt, где каждое поле представляет собой отдельную пару «ключ-значение», а не неструктурированную текстовую строку. Grafana Loki хранит структурированные логи как есть в сжатых чанках, не разбирая их при записи, однако LogQL предоставляет операторы первого класса для разбора и извлечения полей во время выполнения запроса с помощью парсеров | json или | logfmt. После разбора извлечённые поля становятся доступны как временные метки для фильтрации с |= "error", операторов сравнения или метрических агрегаций, предоставляя гибкость структурированного логирования без стоимости индексирования каждого поля. Например, строку JSON-лога вида {"level":"error","service":"auth"} можно запросить в Loki с помощью {job="app"} | json | level="error" для фильтрации только записей уровня ошибки. Внедрение структурированных логов во всём парке приложений — это лучшая практика Grafana Loki, поскольку это делает извлечение меток LogQL надёжным и позволяет командам строить согласованные запросы для алертов и дашбордов.

Как это работает

Структурированные логи: в Loki log stream — уникальная комбинация labels. Labels — key-value pairs (e.g., {app="nginx", env="prod", pod="nginx-7d"}), идентифицирующие источник. Loki индексирует labels, НЕ содержимое лога — поэтому design labels тщательно критичен. High-cardinality labels (user_id, request_id, timestamp) взрывают индекс + убивают perf. Структурированные логи (JSON) намного легче фильтровать + extract из них чем free text — логируйте в JSON.

Когда применять

Держите labels мало + low-cardinality — app, env, namespace, level хороши; user_id, trace_id, timestamp плохи (high cardinality). Используйте содержимое лога (не labels) для filter по request-specific значениям через LogQL |= или |~. Всегда structured-log (JSON) — Promtail/Loki парсят поля без дорогого regex.

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

Ловушки Структурированные логи: добавляют request_id или user_id как label (cardinality explosion → Loki умирает); слишком мало labels (один огромный stream, не масштабируется ingest); inconsistent labels между сервисами (queries становятся per-service спагетти); unstructured logs, требующие regex на каждом query.

Связанные понятия

Полезные ресурсы