Структурные логи: Serilog, корреляция, уровни, что не логировать
↑ 7.2 Observability: логи, метрики, трейсинг, OpenTelemetry · ← Предыдущая · → Следующая
Зачем это на собесе
Практика логирования: какие уровни, как коррелировать, что нельзя писать.
Объяснение
Основы логирования в ASP.NET Core — в Логирование: ILogger, уровни, structured logging, Serilog. Здесь — эксплуатационные правила.
| Уровень | Когда |
|---|---|
| Error | операция не удалась, требуется внимание |
| Warning | нештатно, но обработано (ретрай, деградация) |
| Information | ключевые бизнес-события (заказ создан) |
| Debug/Trace | детали, в проде выключены |
Правила:
- Структурные логи (JSON) с полями:
timestamp,level,message template,trace_id,span_id,service,env,user_id(идентификатор, а не персональные данные). - Корреляция:
Activity.Current?.TraceIdавтоматически попадает в логи при включённомIncludeScopes/SerilogEnrich.WithSpan(). - Логируйте на границах (вход/выход, обращения к внешним системам), а не в каждом методе.
- Исключение логируется один раз, там, где обрабатывается.
- Семплирование шумных логов и ограничение частоты.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.Enrich.FromLogContext().Enrich.WithProperty("service", "orders")
.Destructure.ByTransforming<User>(u => new { u.Id }) // не логировать лишние поля
.WriteTo.Console(new RenderedCompactJsonFormatter())
.CreateLogger();Что не логировать: пароли, токены, ключи, номера карт, паспортные и медицинские данные, тела запросов целиком, заголовок Authorization. Применяйте маскирование и allowlist полей.
Нюансы и подводные камни
- Логи в файлах в контейнере: пишите в stdout, собирает агент (Promtail, Fluent Bit, OTel Collector).
- Логирование синхронно замедляет запросы: асинхронные sinks, буферы.
- Логи на Debug в проде включайте временно и точечно.
- Стоимость хранения: retention и уровни по окружениям.
Практика
- Настройте JSON-логи с
trace_idи найдите запрос по нему в Loki/Elastic. - Добавьте маскирование секретов.
- Снизьте объём логов на 50% без потери диагностической ценности.
Вопросы с ответами
Что нельзя логировать?
Секреты, персональные и платёжные данные, токены и полные тела запросов.
Как связать логи разных сервисов?
Общий
trace_id(W3C traceparent) в каждой записи.