Язык программирования 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.cs к следующему виду:
using System;
using System.Runtime.CompilerServices;
namespace AutoLot.Services.Logging
{
public interface IAppLogging<T>
{
void LogAppError(Exception exception, string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppError(string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppCritical(Exception exception, string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppCritical(string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppDebug(string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppTrace(string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppInformation(string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
void LogAppWarning(string message,
[CallerMemberName] string memberName = "",
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0);
}
}
Атрибуты CallerMemberName, CallerFilePath и CallerLineNumber инспектируют стек вызовов для получения имени члена, пути к файлу и номера строки в вызывающем коде. Например, если строка, в которой вызывается LogAppWarning(), находится в функции DoWork() внутри файла по имени MyClassFile.cs, а номер этой строки 36, тогда вызов:
_appLogger.LogAppWarning("A warning");
преобразуется в следующий эквивалент:
_appLogger.LogAppWarning ("A warning","DoWork","c:/myfilepath/MyClassFile.cs",36);
Если методу при вызове передаются значения, тогда переданные значения используются вместо значений из атрибутов.
Класс AppLogging
Класс AppLogging реализует интерфейс IAppLogging. Добавьте новый класс по имени AppLogging и модифицируйте операторы using, как показано ниже:
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Serilog.Context;
Сделайте класс открытым и реализующим интерфейс IAppLogging<T>. Добавьте конструктор, который принимает экземпляр реализации ILogger<T> (интерфейс, поддерживаемый напрямую ASP.NET Core) и экземпляр реализации IConfiguration. Внутри конструктора получите доступ к конфигурации, чтобы извлечь имя приложения из файла настроек. Все три элемента (ILogger<T>, IConfiguration и имя приложения) необходимо сохранить в переменных уровня класса.