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 (разные профили).