#c# #asp.net-core #logging #.net-core #dependency-injection
#c# #asp.net-core #ведение журнала #.net-ядро #внедрение зависимостей
Вопрос:
Как я могу регистрировать пользовательскую информацию / ошибку на основе поставщиков, зарегистрированных без внедрения зависимостей конструктора в каждом классе? (из-за того, что у меня есть один контроллер, несколько репозиториев, вызываемых внутри контроллера, и я не могу изменить конструктор класса repo i, e.)
Например, я хочу зарегистрировать информацию в приведенном ниже контексте, не касаясь конструктора контроллера
public override void OnException(ExceptionContext context)
{
base.OnException(context);
var logger = Dependency.Resolve<ILogger>();
**//var logger = getIloggerSomehow from startup regsistred loggers**
logger.LogInformation("Custom Info");
}
Мои службы запуска представлены ниже, и они записывают журналы dotnet и Microosft везде, где я ожидаю.
Как я могу написать пользовательский журнал во всех этих местах?
services.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(Configuration.GetSection("Logging")); loggingBuilder.AddAWSProvider(Configuration.GetAWSLoggingConfigSection());
loggingBuilder.SetMinimumLevel(LogLevel.Debug);
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
});
Комментарии:
1. Почему? Это жестко кодирует ссылку на контейнер DI, именно то,
ILogger
что должно предотвращать. Вместо того, чтобы зависеть только от библиотеки ведения журнала, теперь вы будете зависеть от библиотеки ведения журнала и конкретной библиотеки DI2. @PanagiotisKanavos, спасибо. в противном случае, как я могу добавить сюда пользовательское ведение журнала, которое будет распространяться среди всех поставщиков
3. Вы могли бы использовать одноэлементный LoggingFactory и использовать его для создания регистраторов по мере необходимости или даже создать одноэлементный регистратор. Таким образом, вы избегаете зависимости от контейнера DI. Снова
why
имеет значение4.
how can i add the custom logging here whihc will be distributed to all providers
путем настройки ведения журнала внутриAddLogging
. Внедрение конструктора делает это проще , а не сложнее — внедрение не влияет на то, как работает ведение журнала, но вам не нужно заглядывать в несколько мест, чтобы создать свой регистратор, и вам не нужно беспокоиться об отсутствии поля регистратора. Что все же означает эта фраза? Какой тип пользовательского ведения журнала вы имеете в виду?5. В принципе, мне нужен глобальный объект журнала, с помощью которого я могу входить в систему. LogInformation() через приложения out
Ответ №1:
Вы можете разрешить службу из context
в OnException
методе:
using Microsoft.Extensions.DependencyInjection;
...
var service = context.HttpContext.RequestServices.GetService<ILogger<YourFilter>>();
Комментарии:
1. var logger = context.HttpContext.RequestServices. GetService<ILogger>(); всегда имеет значение null
2. Как вы регистрировались
ILogger
тогда?3. Или вы пытаетесь разрешить
ILogger<T>
? Тогда просто заменитеT
тип фильтра. Смотрите мою правку.4. я зарегистрировал Ilogger sa в службах ниже. Добавить блокировку(loggingBuilder => { loggingBuilder. Добавить конфигурацию (Configuration. GetSection(«Ведение журнала»)); loggingBuilder. AddAWSProvider(Конфигурация. Получаем LOGGINGCONFIGSECTION()); loggingBuilder. Установите минимальный уровень (LogLevel. Отладка); loggingBuilder. AddConsole(); loggingBuilder. AddDebug(); });
5. Ты пробовал
context.HttpContext.RequestServices.GetService<ILogger<YourClass>>();
?