Логирование в 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)