netcore:不使用LoggerFactory手动创建Logger

时间:2019-01-25 21:55:38

标签: logging dependency-injection .net-core

我正在使用以下方法创建控制台记录器:

_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).' 

我不在依赖注入容器的上下文中。

更新: 我也尝试过像这样使用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)      

看来我无法从容器中获取记录器

2 个答案:

答案 0 :(得分:3)

接口已更改,因此您可以在LoggerFactory上使用静态Create()工厂方法,并在用于配置提供程序的配置对象中传递委托。然后可以像以前一样使用工厂来创建记录器:

    ILogger<Program> logger = LoggerFactory
        .Create(logging => logging.AddConsole())
        .CreateLogger<Program>();
    logger.LogInformation("Hello World!");

尽管应用程序通常应使用主机生成器,但这在单元测试中可能非常有用,因为您可以传入写入控制台的真实记录器(而不是模拟程序),并在测试结果中查看输出

这取自https://github.com/sgryphon/essential-logging/tree/master/examples/GettingStarted

上的简单漫游示例

还有更多示例展示了如何通过主机构建器进行配置,以及如何使用Microsoft高性能日志记录模式。

答案 1 :(得分:1)

如果要创建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>至少可以帮助您避免空引用异常。