Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Стандартная инфраструктура 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, который будет создаваться в папке проекта.