我正在使用以下方法创建控制台记录器:
_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)
看来我无法从容器中获取记录器
答案 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>
至少可以帮助您避免空引用异常。