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

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

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

Начать курс

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

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

1. Microsoft.Extensions.Logging (Встроенный ILogger)

Начиная с .NET Core, Microsoft предоставляет абстракцию для логирования — интерфейс ILogger<T> и фабрику ILoggerFactory. Это не полноценная библиотека, а контракт, под который можно подключить любую реализацию (NLog, Serilog и т.д.).

Плюсы: встроен в ASP.NET Core, не требует дополнительных зависимостей для базового логирования, легко заменяется на другую библиотеку.

Минусы: ограниченный функционал "из коробки" (только уровни: Trace, Debug, Information, Warning, Error, Critical). Нет структурированных данных.

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

using Microsoft.Extensions.Logging;

public class OrderService
{
    private readonly ILogger<OrderService> _logger;

    public OrderService(ILogger<OrderService> logger)
    {
        _logger = logger;
    }

    public void ProcessOrder(int orderId)
    {
        _logger.LogInformation("Обработка заказа {OrderId}", orderId);
        try
        {
            // Логика обработки
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Ошибка при обработке заказа {OrderId}", orderId);
        }
    }
}

2. Serilog (Структурированное логирование)

Serilog — лидер по гибкости и популярности. Его главная фишка — структурированное логирование. Вместо строковых сообщений вы передаете объекты, которые автоматически сериализуются в JSON или другой формат. Это позволяет легко анализировать логи через Elasticsearch, Seq или Grafana.

Плюсы: отличная интеграция с .NET, мощные "enrichers" (обогащение контекстом), поддержка sink-ов (вывод в файл, БД, консоль, облачные сервисы).

Минусы: для простых приложений может быть избыточен, требует настройки.

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

using Serilog;

// Настройка в Program.cs
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console()
    .WriteTo.File("logs/myapp-.log", rollingInterval: RollingInterval.Day)
    .WriteTo.Seq("http://localhost:5341")
    .Enrich.WithProperty("Application", "MyApp")
    .CreateLogger();

try
{
    Log.Information("Запуск приложения");
    var user = new { Id = 1, Name = "Иван" };
    Log.Information("Пользователь {User} вошел в систему", user);
}
catch (Exception ex)
{
    Log.Fatal(ex, "Критическая ошибка");
}
finally
{
    Log.CloseAndFlush();
}

3. NLog (Производительность и гибкость)

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

Плюсы: очень быстрый, поддерживает асинхронное логирование, умеет отправлять логи по email, в базы данных, в EventLog. Отличная поддержка .NET Framework и .NET Core.

Минусы: синтаксис конфигурации XML может показаться громоздким.

Пример конфигурации nlog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target name="file" xsi:type="File" 
            fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate}|${level:uppercase=true}|${message}|${exception:format=ToString}" />
    <target name="console" xsi:type="Console" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="file,console" />
  </rules>
</nlog>

Использование в коде:

using NLog;

public class PaymentService
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    public void Pay(decimal amount)                    

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