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