netcore: вручную создать Logger без использования LoggerFactory - PullRequest
0 голосов
/ 26 января 2019

Я создаю консольный логгер, используя:

_log = new LoggerFactory().AddConsole().CreateLogger(this.GetType().Name);

Теперь я получаю следующее предупреждение:

controllers\DummyController.cs(31,20): warning CS0618:
'ConsoleLoggerExtensions.AddConsole(ILoggerFactory)' is obsolete: 
'This method is obsolete and will be removed in a future version. The 
recommended alternative is AddConsole(this ILoggingBuilder builder).' 

Я не в контексте контейнера внедрения зависимостей.

UPDATE: Я также пытался использовать DI, как это:

var serviceProvider = new ServiceCollection()
    .AddLogging()
    .BuildServiceProvider();
var log = serviceProvider.GetService<ILogger>();
log.LogInformation("testing _log");

Но я получаю следующую ошибку:

Error Message:                                                                                                                                                
  System.ArgumentNullException : Value cannot be null.                                                                                                         
Parameter name: logger                                                                                                                                        
Stack Trace:                                                                                                                                                  
   at Microsoft.Extensions.Logging.LoggerExtensions.Log(ILogger logger, LogLevel logLevel, EventId eventId, Exception exception, String message, Object[] args)                                                                                                                                                             
   at Microsoft.Extensions.Logging.LoggerExtensions.LogInformation(ILogger logger, String message, Object[] args)      

Кажется, я не могу получить регистратор из контейнера

1 Ответ

0 голосов
/ 26 января 2019

Если вы создаете DI-контейнер, вы можете использовать следующий код для создания экземпляра регистратора с завода.

var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.Create("mylogger");
logger.LogInformation("Hello {0}", "world");

Или вы можете создать его из типизированного интерфейса

var logger = serviceProvider.GetRequiredService<ILogger<MyType>>();
logger.LogInformation("Hello {0}", "world");

Вы не можете сделать следующее:

var logger = serviceProvider.GetRequiredService<ILogger>();

Поскольку неуниверсальный интерфейс не зарегистрирован в контейнере Dependency Injection, причина этого заключается в том, что библиотеки журналов выводят имя регистратора из универсального типа, и когда вы используете только ILogger, нет ничего для получения имя от MyProject.MyNamespace.MyType.

Немного не по теме, но использование метода расширения GetRequiredService<T> вместо GetService<T> по крайней мере поможет вам избежать исключения нулевой ссылки.

...