Логирование для C# (.NET): лучшие решения и библиотеки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Логирование для C# (.NET): обзор лучших решений

Логирование — критически важный аспект разработки любого серьёзного приложения на C#. Оно позволяет отслеживать состояние системы, диагностировать ошибки, анализировать поведение пользователей и собирать метрики производительности. В экосистеме .NET существует несколько зрелых библиотек для логирования, каждая из которых имеет свои сильные стороны. В этой статье мы рассмотрим три наиболее популярных решения: Serilog, NLog и log4net, а также стандартную абстракцию Microsoft.Extensions.Logging.

Зачем нужна отдельная библиотека для логирования?

Встроенный класс System.Diagnostics.Debug или Console.WriteLine подходит только для самых простых сценариев. Профессиональные библиотеки предоставляют:

  • Уровни логирования (Trace, Debug, Information, Warning, Error, Fatal) — гибкая фильтрация сообщений.
  • Структурированное логирование — сохранение данных в формате JSON с возможностью последующего анализа.
  • Множество "приёмников" (sinks/targets) — запись в файл, базу данных, консоль, ELK-стек, Sentry, Application Insights и т.д.
  • Динамическая конфигурация — изменение уровня логирования без перезапуска приложения.
  • Производительность — асинхронная запись, буферизация, минимальное влияние на скорость работы.

1. Serilog — современный стандарт

Serilog — самая популярная библиотека для .NET, которая сделала ставку на структурированное логирование. Вместо форматирования строк с помощью string.Format вы используете именованные плейсхолдеры:

using Serilog;

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console()
    .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)
    .WriteTo.ApplicationInsights(TelemetryConfiguration.Active, TelemetryConverter.Traces)
    .CreateLogger();

// Пример структурированного логирования
Log.Information("Пользователь {UserId} выполнил заказ {OrderId} на сумму {Total:C}", 
    userId, orderId, total);

Serilog идеально подходит для микросервисов, облачных приложений и проектов, где важен глубокий анализ логов через Kibana или Grafana.

2. NLog — гибкость и производительность

NLog — мощная библиотека с богатыми возможностями маршрутизации. Она поддерживает как XML-конфигурацию, так и программную настройку. Особенность NLog — встроенный механизм асинхронной записи и поддержка условных правил.

using NLog;

private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

public void ProcessOrder(Order order)
{
    Logger.Info("Начало обработки заказа {OrderId}", order.Id);
    try
    {
        // бизнес-логика
        Logger.Debug("Заказ {OrderId} успешно обработан", order.Id);
    }
    catch (Exception ex)
    {
        Logger.Error(ex, "Ошибка обработки заказа {OrderId}", order.Id);
        throw;
    }
}

NLog часто выбирают для настольных приложений (WPF, WinForms) и legacy-проектов благодаря простоте миграции с log4net.

3. log4net — проверенный ветеран

log4net — порт популярной Java-библиотеки log4j. Это самое "возрастное" решение, которое всё ещё активно используется в корпоративных проектах. Главный плюс — огромное количество адаптеров и "аппендеров" (appenders), написанных за десятилетия.

// Конфигурация через XML (log4net.config)
<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <file value="logs/app.log" />
        <rollingStyle value="Date" />
        <datePattern value="yyyyMMdd" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="INFO" />
        <appender-ref ref="RollingFile" />
    </root>
</log4net>

Недостаток log4net — отсутствие нативной поддержки структурированного логирования (только текст). Однако его можно дополнить сторонними расширениями.

4. Microsoft.Extensions.Logging — стандартная абстракция

Начиная с .NET Core, Microsoft представила встроенный интерфейс ILogger<

Рекомендаций