Язык программирования C#9 и платформа .NET5
public static void Log(this ILogger logger, LogLevel logLevel,Exception exception, string message, params object[] args)public static void Log(this ILogger logger, LogLevel logLevel, EventId eventId,Exception exception, string message, params object[] args)}Яркая характеристика ASP.NET Core связана с расширяемостью конвейера в целом и с ведением журнала в частности. Стандартное средство ведения журнала может быть заменено другой инфраструктурой ведения журнала при условии, что новая инфраструктура способна интегрироваться с установленным шаблоном ведения журнала. Serilog — одна из инфраструктур, которая хорошо интегрируется с ASP.NET Core. В последующих разделах демонстрируется создание инфраструктуры ведения журнала, основанной на Serilog, и конфигурирование приложений ASP.NET Core для использования нового кода регистрации в журнале.
Интерфейс IAppLogging
Начните с добавления в проект
нового каталога по имениAutoLot.Services. Добавьте в этот каталог новый файл под названиемLoggingдля интерфейсаIAppLogging.cs. Приведите содержимое файлаIAppLogging<T>к следующему виду:IAppLogging.csusing System;using System.Runtime.CompilerServices;namespace AutoLot.Services.Logging{public interface IAppLogging<T>{void LogAppError(Exception exception, string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppError(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppCritical(Exception exception, string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppCritical(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppDebug(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppTrace(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppInformation(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);void LogAppWarning(string message,[CallerMemberName] string memberName = "",[CallerFilePath] string sourceFilePath = "",[CallerLineNumber] int sourceLineNumber = 0);}}Атрибуты
,CallerMemberNameиCallerFilePathинспектируют стек вызовов для получения имени члена, пути к файлу и номера строки в вызывающем коде. Например, если строка, в которой вызываетсяCallerLineNumber, находится в функцииLogAppWarning()внутри файла по имениDoWork(), а номер этой строки 36, тогда вызов:MyClassFile.cs_appLogger.LogAppWarning("A warning");преобразуется в следующий эквивалент:
_appLogger.LogAppWarning ("A warning","DoWork","c:/myfilepath/MyClassFile.cs",36);Если методу при вызове передаются значения, тогда переданные значения используются вместо значений из атрибутов.
Класс AppLogging
Класс
реализует интерфейсAppLogging. Добавьте новый класс по имениIAppLoggingи модифицируйте операторыAppLogging, как показано ниже:usingusing System;using System.Collections.Generic;using System.Runtime.CompilerServices;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.Logging;using Serilog.Context;Сделайте класс открытым и реализующим интерфейс
. Добавьте конструктор, который принимает экземпляр реализацииIAppLogging<T>(интерфейс, поддерживаемый напрямую ASP.NET Core) и экземпляр реализацииILogger<T>. Внутри конструктора получите доступ к конфигурации, чтобы извлечь имя приложения из файла настроек. Все три элемента (IConfiguration,ILogger<T>и имя приложения) необходимо сохранить в переменных уровня класса.IConfiguration