Структурные логи: Serilog, корреляция, уровни, что не логировать

↑ 7.2 Observability: логи, метрики, трейсинг, OpenTelemetry · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Практика логирования: какие уровни, как коррелировать, что нельзя писать.

Объяснение

Основы логирования в 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/Serilog Enrich.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 и уровни по окружениям.

Практика

  1. Настройте JSON-логи с trace_id и найдите запрос по нему в Loki/Elastic.
  2. Добавьте маскирование секретов.
  3. Снизьте объём логов на 50% без потери диагностической ценности.

Вопросы с ответами

Связанные темы