我将我的项目升级到.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)));