Создание провайдера логгирования

Последнее обновление: 22.12.2021

Стандартная инфраструктура ASP NET Core предоставляет, возможно, не самые удобные способы логгирования - на консоль, в окне Output в Visual Studio. Однако в то же время ASP.NET Core позволяет полностью определить свою логику ведения лога. Допустим, мы хотим сохранять сообщения в текстовом файле.

Вначале добавим в проект новый класс FileLogger:

public class FileLogger : ILogger, IDisposable
{
    string filePath;
    static object _lock = new object();
    public FileLogger(string path)
    {
        filePath = path;
    }
    public IDisposable BeginScope<TState>(TState state)
    {
        return this;
    }

    public void Dispose() { }

    public bool IsEnabled(LogLevel logLevel)
    {
        //return logLevel == LogLevel.Trace;
        return true;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId,
                TState state, Exception? exception, Func<TState, Exception?, string> formatter)
    {
        lock (_lock)
        {
            File.AppendAllText(filePath, formatter(state, exception) + Environment.NewLine);
        }
    }
}

Класс логгера должен реализовать интерфейс ILogger. Этот интерфейс определяет три метода:

  • BeginScope: этот метод возвращает объект IDisposable, который представляет некоторую область видимости для логгера. В данном случае нам этот метод не важен, поэтому возвращаем значение this - ссылку на текущий объект класса, который реализует интерфейс IDisposable.

  • IsEnabled: возвращает значения true или false, которые указыват, доступен ли логгер для использования. Здесь можно здать различную логику. В частности, в этот метод передается объект LogLevel, и мы можем, к примеру, задействовать логгер в зависимости от значения этого объекта. Но в данном случае просто возвращаем true, то есть логгер доступен всегда.

  • Log: этот метод предназначен для выполнения логгирования. Он принимает пять параметров:

    • LogLevel: уровень детализации текущего сообщения

    • EventId: идентификатор события

    • TState: некоторый объект состояния, который хранит сообщение

    • Exception: информация об исключении

    • formatter: функция форматирования, которая с помощью двух предыдущих параметов позволяет получить собственно сообщение для логгирования

    И в данном методе как раз и производится запись в текстовый файл. Путь к этому файлу передается через конструктор

Далее добавим в проект класс FileLoggerProvider:

public class FileLoggerProvider : ILoggerProvider
{
    string path;
    public FileLoggerProvider(string path)
    {
        this.path = path;
    }
    public ILogger CreateLogger(string categoryName)
    {
        return new FileLogger(path);
    }

    public void Dispose() {}
}

Этот класс представляет провайдер логгирования. Он должен реализовать интерфейс ILoggerProvider. В этом интерфейсе определны два метода:

  • CreateLogger: создает и возвращает объект логгера. Для создания логгера используется путь к файлу, который передается через конструктор

  • Dispose: управляет освобождение ресурсов. В данном случае пустая реализация

Теперь создадим вспомогательный класс FileLoggerExtensions:

public static class FileLoggerExtensions
{
    public static ILoggingBuilder AddFile(this ILoggingBuilder builder, string filePath)
    {
        builder.AddProvider(new FileLoggerProvider(filePath));
        return builder;
    }
}

Этот класс добавляет к объекту ILoggingBuilder метод расширения AddFile, который будет добавлять наш провайдер логгирования.

Теперь используем провайдер в файле Program.cs:

var builder = WebApplication.CreateBuilder();
// устанавливаем файл для логгирования
builder.Logging.AddFile(Path.Combine(Directory.GetCurrentDirectory(), "logger.txt"));
// настройка логгирования с помошью свойства Logging идет до 
// создания объекта WebApplication
var app = builder.Build();

app.Run(async (context) =>
{
    app.Logger.LogInformation($"Path: {context.Request.Path}  Time:{DateTime.Now.ToLongTimeString()}");
    await context.Response.WriteAsync("Hello World!");
});

app.Run();

За глобальную установку настроек логгирования отвечает свойство Logging класса WebApplicationBuilder. Это свойство представляет объект ILoggingBuilder и предоставляет ряд методов для управления логгированием. И в данном случае с помошью выше определенного метода AddFile добавляем логгирование в файл.

Стоит отметить, что глобальная настройка логгирования должна идти до создания объекта WebApplication.

Теперь для логгирования также будет использоваться файл logger.txt, который будет создаваться в папке проекта.

Создание провайдера логгирования в ASP.NET Core и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850