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

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

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

Начать курс

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

Логирование — это не просто запись сообщений в файл. В современной разработке на C# (.NET) это мощный инструмент мониторинга, отладки и анализа поведения приложения. Правильно настроенное логирование позволяет быстро находить ошибки, отслеживать производительность и строить аналитику. В этой статье мы рассмотрим самые популярные и эффективные библиотеки для .NET, а также лучшие практики их использования.

Зачем нужно профессиональное логирование?

Базовый Console.WriteLine или Debug.Write не подходят для production-среды. Настоящие фреймворки для логирования предоставляют:

  • Уровни логирования (Trace, Debug, Information, Warning, Error, Critical) — фильтрация важности сообщений.
  • Структурированные данные — логи в формате JSON, которые легко парсить (ELK, Splunk).
  • Множество приемников (Sinks/Targets) — запись в файл, консоль, базу данных, облачные сервисы (Azure, AWS).
  • Конфигурацию — настройка поведения без перекомпиляции кода.
  • Асинхронность — минимизация влияния на производительность приложения.

Топ библиотек для .NET

Рассмотрим четыре основных решения, которые доминируют в экосистеме .NET.

1. Serilog — стандарт структурированного логирования

Serilog — это самая популярная библиотека для .NET, которая первой популяризировала концепцию structured logging. Вместо склеивания строк, вы передаете шаблон и параметры, что позволяет сохранять данные в машиночитаемом формате.

Основные возможности:

  • Глубокая интеграция с .NET Core / .NET 5+.
  • Огромное количество Sinks (Serilog.Sinks.Console, Serilog.Sinks.File, Serilog.Sinks.ElasticSearch).
  • Поддержка Enrichers для автоматического добавления контекста (имя машины, версия приложения, ThreadId).
  • Чистый и лаконичный API.

Пример настройки и использования Serilog:

using Serilog;

// Настройка в Program.cs (.NET 6+)
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Information()
    .WriteTo.Console()
    .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)
    .Enrich.WithMachineName()
    .CreateLogger();

try
{
    Log.Information("Приложение запущено");
    var userId = 123;
    Log.Information("Пользователь {UserId} выполнил вход", userId);
    // Пример с исключением
    throw new InvalidOperationException("Тестовая ошибка");
}
catch (Exception ex)
{
    Log.Error(ex, "Произошла критическая ошибка в методе {Method}", nameof(Main));
}
finally
{
    Log.CloseAndFlush();
}

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

NLog — один из старейших фреймворков, который отлично справляется с высоконагруженными системами. Его главная фишка — гибкая маршрутизация правил (rules) и поддержка асинхронной записи "из коробки".

Ключевые особенности:

  • Поддержка XML, JSON и code-based конфигурации.
  • Встроенная поддержка ротации логов по размеру и времени.
  • Расширяемость за счет пользовательских Target'ов.
  • Меньшее потребление памяти по сравнению с Serilog в некоторых сценариях.

Пример настройки NLog через код:

using NLog;
using NLog.Config;
using NLog.Targets;

// Настройка логгера
var config = new LoggingConfiguration();
var consoleTarget = new ConsoleTarget("console");
config.AddRule(LogLevel.Info, LogLevel.Fatal, consoleTarget);

var fileTarget = new FileTarget("file")
{
    FileName = "${basedir}/logs/${shortdate}.log",
    Layout = "${longdate} | ${level:uppercase=true} | ${message} ${exception:format=ToString}"
};
config.AddRule(LogLevel.Debug, LogLevel.Fatal, fileTarget);

LogManager.Configuration = config;
var logger = LogManager.GetCurrentClassLogger();

logger.Info("Приложение готово к работе");
logger.Warn("Это предупреждение для пользователя {User}", "Admin");

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

log4net — порт популярной Java-библиотеки log4j. Хотя он считается менее современным, его все еще активно используют в legacy-проектах и enterprise-среде. Он требует настройки через XML-файл (App.config).

Характеристики:

  • Стабильная

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