Работали ли вы с системами логирования?

«Работали ли вы с системами логирования?» — вопрос из категории DevOps, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал с различными библиотеками и системами для сбора, структурирования и анализа логов.

Стек и практики:

  1. Библиотеки в .NET:

    • Serilog: Современный стандарт де-факто. Позволяет использовать структурированное логирование (JSON) и множество "стоков" (sinks).
    • NLog / log4net: Классические, мощные библиотеки.
    • ILogger<T> из Microsoft.Extensions.Logging: Абстракция, поверх которой работают Serilog, NLog и др.
  2. Пример настройки Serilog с выводом в консоль и файл (JSON):

    // Program.cs (ASP.NET Core 6+)
    using Serilog;
    
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) // Снижаем шум от фреймворка
        .Enrich.FromLogContext() // Добавляем контекст (например, TraceId)
        .WriteTo.Console(new JsonFormatter()) // JSON в консоль
        .WriteTo.File("logs/app-.json", rollingInterval: RollingInterval.Day) // JSON в файл
        .CreateLogger();
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Host.UseSerilog(); // Подключаем Serilog как провайдера
  3. Структурированное логирование (ключевая практика):

    // Вместо интерполяции строки (плохо для анализа)
    _logger.LogInformation($"User {userId} ordered product {productId}");
    
    // Используем именованные параметры (хорошо)
    _logger.LogInformation("User {UserId} ordered product {ProductId}", userId, productId);
    // В лог попадет: {"@t":"...","@m":"User 123 ordered product 456","UserId":123,"ProductId":456}
  4. Централизованный сбор логов (ELK/EFK Stack, Seq, Application Insights):

    • Цель: Агрегация логов со всех инстансов приложения в одном месте для поиска и анализа.
    • Пример с Seq:
      .WriteTo.Seq("http://localhost:5341")
    • Пример с Application Insights:
      builder.Services.AddApplicationInsightsTelemetry();
      // Логи ILogger автоматически отправляются как трассировки (traces).

Важные аспекты:

  • Уровни логирования: Debug, Info, Warning, Error, Critical. Важно правильно выбирать уровень.
  • Контекст: Добавление CorrelationId/RequestId для отслеживания цепочек запросов.
  • Производительность: Избегать дорогих операций (например, сериализации объектов) при отключенном уровне логирования. Используйте Logger.IsEnabled(LogLevel.Debug).
  • Не логировать конфиденциальные данные (PII, пароли, токены).