Gymterview
middle

Что такое Structured Logging и зачем оно нужно?

Structured Logging — логирование в машиночитаемом формате (обычно JSON) вместо plain text. Позволяет эффективно искать, фильтровать и анализировать логи в системах агрегации по отдельным полям.

Plain text vs Structured (JSON)

Аспект Plain text Structured (JSON)
Читаемость человеком Высокая Низкая без инструментов
Машинный парсинг Сложный (regex) Нативный (по полям)
Фильтрация По подстроке По конкретным полям (orderId=123)
Интеграция с ELK/Loki Требует grok-паттернов Из коробки
Использование Dev-среда Production

Plain text:

Пример
2026-04-22 10:15:32 INFO OrderService - Заказ создан: orderId=12345, userId=678, amount=99.99

Structured (JSON):

Пример
{
  "timestamp": "2026-04-22T10:15:32.456Z",
  "level": "INFO",
  "logger": "com.example.OrderService",
  "message": "Заказ создан",
  "orderId": 12345,
  "userId": 678,
  "amount": 99.99,
  "requestId": "a1b2c3d4"
}

Настройка JSON-логирования в Logback

Используется Logstash encoder:

Пример
<!-- logback-spring.xml -->
<appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <includeMdcKeyName>requestId</includeMdcKeyName>
        <includeMdcKeyName>userId</includeMdcKeyName>
    </encoder>
</appender>

Зависимость в pom.xml:

Пример
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.4</version>
</dependency>

Добавление structured полей в код

Пример
import static net.logstash.logback.argument.StructuredArguments.*;

log.info("Заказ создан", kv("orderId", orderId), kv("amount", amount));
// JSON: {"message":"Заказ создан","orderId":12345,"amount":99.99}

// SLF4J 2.x fluent API:
log.atInfo()
    .addKeyValue("orderId", orderId)
    .addKeyValue("amount", amount)
    .log("Заказ создан");

Частые ошибки

  • JSON-логи в dev-среде — нечитаемо для человека; используйте профили (plain text для dev, JSON для prod)
  • Логирование огромных объектов — log.info("Request: {}", requestBody) с большим JSON замедляет систему
  • Не добавлять бизнес-контекст — JSON без orderId, userId не полезнее plain text

Как используется в 2026

  • Structured logging — стандарт для production в Kubernetes/cloud
  • Grafana Loki / Elasticsearch — основные системы для поиска по structured логам
  • Spring Boot 3.x поддерживает structured logging из коробки через logging.structured.format.console=logstash
  • MDC-данные автоматически включаются в JSON-вывод

На собеседовании: объясните, почему plain text недостаточен для production — невозможно эффективно фильтровать по полям. Частая ошибка — не упомянуть, что в dev-среде по-прежнему удобнее plain text (разные профили).