Ответ
Да, есть обширный опыт. Для логирования в файл в .NET экосистеме используются как простые средства System.IO, так и мощные специализированные библиотеки.
1. Простой подход с System.IO.File:
Подходит для быстрых скриптов или прототипов, но не для production-систем из-за отсутствия ротации, асинхронности и управления блокировками.
string logEntry = $"{DateTime.UtcNow:O} [INFO] Application started.n";
File.AppendAllText("app.log", logEntry);
2. Профессиональный подход с библиотеками (Serilog/NLog): Для production обязательно использовать библиотеки. Рассмотрим Serilog.
Настройка Serilog для записи в файл с ротацией:
using Serilog;
// Конфигурация в коде (обычно выносится в appsettings.json)
Log.Logger = new LoggerConfiguration()
.WriteTo.File(
path: "logs/app-.log", // Шаблон имени файла
rollingInterval: RollingInterval.Day, // Ротация по дням
retainedFileCountLimit: 30, // Храним логи за 30 дней
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
)
.CreateLogger();
try
{
Log.Information("Запуск приложения");
// Код приложения...
}
catch (Exception ex)
{
Log.Error(ex, "Приложение завершилось с ошибкой");
}
finally
{
Log.CloseAndFlush(); // Важно для сброса буферизованных записей
}
Ключевые преимущества библиотек:
- Ротация логов: По размеру, дате или комбинированно.
- Структурированное логирование: Запись в формате JSON для последующего анализа в системах вроде Elasticsearch.
Log.Information("Обработан заказ {@Order}", order); // Объект сериализуется в JSON - Асинхронная запись: Не блокирует основной поток выполнения.
- Гибкая настройка уровней: Разные уровни (Debug, Info, Error) для разных источников.
- Несколько приемников (Sinks): Одновременная запись в файл, консоль, базу данных, Grafana Loki и т.д.