如何修复过时的ILoggerFactory方法



我将我的项目升级到.NET Core 2.2.x,并收到了关于以下代码的过时警告-两行都是:

public void Configure(IApplicationBuilder app, 
IHostingEnvironment env, 
ILoggerFactory loggerFactory) 
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));

建议修复The recommended alternative is AddConsole(this ILoggingBuilder builder)。我想这就是我正在使用的。

我在这里错过了什么?

我今天遇到了同样的问题。

从Startup.cs中删除日志记录配置,然后转到Program.cs文件并添加类似以下内容:

var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.Build();

这使用了"生成器",因为变量"logging"是IloggingBuilder(而您的代码仍在使用ILoggerFactory(

更新:我刚刚尝试的另一种方法是留在Startup.cs内部,但将日志记录内容从"Configure"方法移到"ConfigureServices",如下所示:

public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
});
}

也许可以减少程序的污染。。。

文档中建议使用AddConsole(this ILoggingBuilder builder)是正确的,但要做到这一点,您需要添加对NuGet包的引用Microsoft.Extensions.Logging.Console

当我将日志记录代码从.Net Core 2.1更新到3.0时,我收到了同样的警告。MSDN上记录了建议的升级方法。

在我的案例中,我试图为控制台获取LoggerFactory的实例,这在.Net Core 3.0:中非常简单

using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()))
{
// use loggerFactory
}

别担心,这是有史以来最愚蠢的事情!

注意

以下代码示例使用ConsoleLoggerProvider构造函数在版本2.2中已废弃。正确更换过时的日志API将在3.0版本中提供。在同时,忽略和抑制警告是安全的。

如果你认为你忘记了Obsolete的意思,你没有!不要担心,现在就忽略它——或者取消警告(对不起,我手头没有代码(。

(希望他们能更好地解释为什么要这样做——这就是我所说的愚蠢。(

根据GitHub上为此打开的问题,如果您在Program.cs.中使用CreateDefaultBuilder((方法,则已经调用了替换方法

https://github.com/aspnet/Docs/issues/9829

我唯一的问题是,我只为非生产环境打开了这些。。而且看不出今后有什么办法。

如果您没有访问LoggerFactory.Create()的权限,use仍然可以使用带有AddProvider((方法的ILoggerFactory,为其提供ConsoleLoggerProvider((,但如果您想做一些简单的事情,这会有点麻烦。问题是,ConsoleLoggerProvider()需要IOptionsMonitor<控制台记录器选项>作为一个参数和最简单的事情,如果你

  • 您无法访问代码库中的选项机制(我的问题(,或者
  • 现有代码库中的实际选项机制与IOptionsMonitor<>不匹配,或者
  • 您还有其他不使用ASP.Net选项工具的原因

是创建一个伪类:

using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Console;
using Microsoft.Extensions.Options;

class DummyConsoleLoggerOptionsMonitor : IOptionsMonitor<ConsoleLoggerOptions>
{
private readonly ConsoleLoggerOptions option = new ConsoleLoggerOptions();
public DummyConsoleLoggerOptionsMonitor(LogLevel level)
{
option.LogToStandardErrorThreshold = level;
}
public ConsoleLoggerOptions Get(string name)
{
return this.option;
}
public IDisposable OnChange(Action<ConsoleLoggerOptions, string> listener)
{
return new DummyDisposable();
}
public ConsoleLoggerOptions CurrentValue => this.option;
private sealed class DummyDisposable : IDisposable
{
public void Dispose()
{
}
}
}

然后,您可以像一样使用ILoggerFactory

factory.AddProvider(
new ConsoleLoggerProvider(
new DummyConsoleLoggerOptionsMonitor(LogLevel.Debug)));

最新更新