ope*_*sas 4 logging dependency-injection .net-core
我正在使用以下方法创建控制台记录器:
_log = new LoggerFactory().AddConsole().CreateLogger(this.GetType().Name);
Run Code Online (Sandbox Code Playgroud)
现在我收到以下警告:
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).'
Run Code Online (Sandbox Code Playgroud)
我不在依赖注入容器的上下文中。
更新:我也试过像这样使用 DI:
var serviceProvider = new ServiceCollection()
.AddLogging()
.BuildServiceProvider();
var log = serviceProvider.GetService<ILogger>();
log.LogInformation("testing _log");
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
似乎我无法从容器中获取记录器
Mat*_*hew 10
如果您要创建依赖项注入容器,则可以使用以下代码从记录器工厂实例化记录器实例。
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.Create("mylogger");
logger.LogInformation("Hello {0}", "world");
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过类型化界面创建它
var logger = serviceProvider.GetRequiredService<ILogger<MyType>>();
logger.LogInformation("Hello {0}", "world");
Run Code Online (Sandbox Code Playgroud)
但是,您无法执行以下操作:
var logger = serviceProvider.GetRequiredService<ILogger>();
Run Code Online (Sandbox Code Playgroud)
由于非泛型接口未在依赖项注入容器中注册,其原因是日志记录库从泛型类型推断记录器名称,并且当您ILogger仅使用时,没有任何内容可以从中派生名称,而MyProject.MyNamespace.MyType.
有点偏离主题,但使用扩展方法GetRequiredService<T>至少GetService<T>可以帮助您避免可能的情况NullReferenceException,并使应用程序更早失败。
接口已更改,因此您可以在 LoggerFactory 上使用静态 Create() 工厂方法,并在配置提供程序的配置对象中传递一个委托。然后可以像以前一样使用工厂来创建记录器:
ILogger<Program> logger = LoggerFactory
.Create(logging => logging.AddConsole())
.CreateLogger<Program>();
logger.LogInformation("Hello World!");
Run Code Online (Sandbox Code Playgroud)
虽然应用程序通常应该使用主机构建器,但这在单元测试中非常有用,因为您可以传入一个写入控制台的真实记录器(而不是模拟),并在测试结果中查看输出。
这是从简单的演练示例中获取的:https : //github.com/sgryphon/essential-logging/tree/master/examples/GettingStarted
还有更多示例展示了如何通过主机构建器进行配置,以及如何使用 Microsoft 高性能日志记录模式。
| 归档时间: |
|
| 查看次数: |
3309 次 |
| 最近记录: |