Есть ли у вас опыт логирования в файл на C#?

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

Ответ

Да, есть обширный опыт. Для логирования в файл в .NET экосистеме используются как простые средства System.IO, так и мощные специализированные библиотеки.

1. Простой подход с System.IO.File: Подходит для быстрых скриптов или прототипов, но не для production-систем из-за отсутствия ротации, асинхронности и управления блокировками.

string logEntry = $"{DateTime.UtcNow:O} [INFO] Application started.n";
File.AppendAllText("app.log", logEntry);

2. Профессиональный подход с библиотеками (Serilog/NLog): Для production обязательно использовать библиотеки. Рассмотрим Serilog.

Настройка Serilog для записи в файл с ротацией:

using Serilog;

// Конфигурация в коде (обычно выносится в appsettings.json)
Log.Logger = new LoggerConfiguration()
    .WriteTo.File(
        path: "logs/app-.log", // Шаблон имени файла
        rollingInterval: RollingInterval.Day, // Ротация по дням
        retainedFileCountLimit: 30, // Храним логи за 30 дней
        outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
    )
    .CreateLogger();

try
{
    Log.Information("Запуск приложения");
    // Код приложения...
}
catch (Exception ex)
{
    Log.Error(ex, "Приложение завершилось с ошибкой");
}
finally
{
    Log.CloseAndFlush(); // Важно для сброса буферизованных записей
}

Ключевые преимущества библиотек:

  • Ротация логов: По размеру, дате или комбинированно.
  • Структурированное логирование: Запись в формате JSON для последующего анализа в системах вроде Elasticsearch.
    Log.Information("Обработан заказ {@Order}", order); // Объект сериализуется в JSON
  • Асинхронная запись: Не блокирует основной поток выполнения.
  • Гибкая настройка уровней: Разные уровни (Debug, Info, Error) для разных источников.
  • Несколько приемников (Sinks): Одновременная запись в файл, консоль, базу данных, Grafana Loki и т.д.