Что такое логирование и зачем оно нужно?
Что такое логирование и зачем оно нужно
Логирование — это последовательная запись событий и состояния системы в виде сообщений (логов). Логи фиксируют происходящее внутри приложений, инфраструктуры и пользовательских транзакций: что произошло, когда, где и в каких условиях. Логи — сырьё для диагностики, аудита, наблюдаемости и аналитики.
Основные цели логирования
-
Отладка и расследование инцидентов — восстановить хронологию событий, найти причину ошибки.
-
Мониторинг и алертинг — по логам строят метрики и правила (ошибки, исключения, паттерны).
-
Постмортем и RCA — данные для разбора инцидента (кто, что, в какое время).
-
Аудит и соответствие — сохранение действий пользователей и изменений конфигурации для безопасности и регуляторов.
-
Бизнес-аналитика — события пользователей, воронки, конверсии (лог как источник событий).
Виды логов
-
Application logs — сообщения приложения (ошибки, события бизнес-логики).
-
Access logs — запросы к HTTP/ресурсам (обычно web-серверы).
-
Audit logs — действия пользователей/админов (аутентификация, изменение прав).
-
System / OS logs — журналы ОС, daemons.
-
Transaction / DB logs — записи транзакций или WAL в БД.
Формат и уровни
-
Формат: unstructured (текст) vs structured (JSON, key=value). Структурированные логи проще парсить, индексировать и извлекать поля.
-
Уровни (severity): TRACE / DEBUG / INFO / WARN / ERROR / FATAL. Уровни помогают фильтровать и выбирать, что сохранять и куда алертить.
Что логировать (рекомендации)
-
временную метку в UTC;
-
уникальный request_id / correlation_id для связывания событий в распределённой системе;
-
уровень и имя компонента/сервиса;
-
контекст (user_id, tenant_id) — только если это безопасно с точки зрения приватности;
-
входные параметры (без секретов), статус ответа, коды ошибок, duration;
-
stacktrace при исключениях;
-
хост, контейнер, версия приложения (release);
-
ссылки на трассы (trace_id) если используются распределённые трейсеры.
Лучшие практики
-
использовать структурированные логи (JSON) с согласованной схемой;
-
стандартизировать поля (timestamp, service, env, level, trace_id, request_id, user_id, message);
-
избегать логирования секретов и чувствительных персональных данных; если нужно — маскировать/хешировать;
-
устанавливать политику ретеншна и ротации (log rotation, compression) и управлять стоимостью хранения;
-
применять sampling и rate-limiting для очень «шумных» эндпоинтов;
-
централизовать (shippers: Fluentd/Fluent Bit, Filebeat, Promtail) и агрегировать (Elasticsearch, Loki, Splunk, BigQuery);
-
обеспечивать быстрый доступ к логам через индексацию и дашборды;
-
связывать логи с метриками и трейсингом (observability triad) для полного контекста;
-
писать понятные и однозначные сообщения: short message + structured fields.
Производительность, стоимость и безопасность
Логи генерируют IO и занимают место — высокочастотные лог-события могут повлиять на производительность и бюджет. Планируйте хранение, архивирование и контроль доступа; шифруйте передачи и хранение, ведите аудит доступа к логам.
Примеры JSON-лога
{
"timestamp":"2025-08-12T10:23:45.123Z",
"service":"orders-api",
"env":"prod",
"level":"ERROR",
"request_id":"abc123",
"trace_id":"trace-xyz",
"user_id":"u-789",
"message":"Failed to process order",
"error":"DBTimeout: deadline exceeded",
"duration_ms":1240,
"host":"app-3"
}
Как логирование интегрируется в наблюдаемость
Логи дают детальные, высококардинальные события; метрики — агрегированные показатели; трейсинг — путь запроса через сервисы. Вместе они дают полноту картины: лог помогает понять «что именно пошло не так», метрики — «как часто/насколько критично», трейсинг — «где в цепочке».
Типичные ошибки
-
отсутствие correlation_id → сложность связывать события;
-
слишком много подробных логов в проде → стоимость и шум;
-
логирование секретов → утечки;
-
разрозненные форматы → плохая парсимость;
-
отсутствие ретеншна и архивации → правовые и финансовые риски.