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

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

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

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

using Microsoft.Extensions.Logging;
using System;
using System.IO;

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

        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)
        {
            if (formatter != null)
            {
                lock (_lock)
                {
                    File.AppendAllText(filePath, formatter(state, exception) + Environment.NewLine);
                }
            }
        }
    }
}

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

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

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

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

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

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

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

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

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

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

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

using Microsoft.Extensions.Logging;

namespace HelloApp
{
    public class FileLoggerProvider : ILoggerProvider
    {
        private string path;
        public FileLoggerProvider(string _path)
        {
            path = _path;
        }
        public ILogger CreateLogger(string categoryName)
        {
            return new FileLogger(path);
        }

        public void Dispose()
        {
        }
    }
}

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

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

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

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

using Microsoft.Extensions.Logging;

namespace HelloApp
{
    public static class FileLoggerExtensions
    {
        public static ILoggerFactory AddFile(this ILoggerFactory factory,
                                        string filePath)
        {
            factory.AddProvider(new FileLoggerProvider(filePath));
            return factory;
        }
    }
}

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

Теперь используем провайдер в классе Startup:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.IO;

namespace HelloApp
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddFile(Path.Combine(Directory.GetCurrentDirectory(), "logger.txt"));
            var logger = loggerFactory.CreateLogger("FileLogger");

            app.Run(async (context) =>
            {
                logger.LogInformation("Processing request {0}", context.Request.Path);
                await context.Response.WriteAsync("Hello World!");
            });
        }
    }
}

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850