我将项目升级到.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)
。我以为这就是我正在使用的。
我在这里想念什么?
答案 0 :(得分:49)
我今天有同样的问题。
从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();
之所以使用'builder',是因为变量'logging'是一个IloggingBuilder(而您的代码仍在使用ILoggerFactory)
更新:我刚刚尝试过的另一种方法是保留在Startup.cs中,但将日志记录内容从“ Configure”方法移动到“ ConfigureServices”,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging(loggingBuilder =>
{
loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));
loggingBuilder.AddConsole();
loggingBuilder.AddDebug();
});
}
也许可以使Program.cs的污染更少...
答案 1 :(得分:10)
当我将日志代码从.Net Core 2.1更新到3.0时,我得到了同样的警告。推荐的升级方式是documented on MSDN。
就我而言,我试图获取LoggerFactory实例作为控制台,在.Net Core 3.0中非常简单:
using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()))
{
// use loggerFactory
}
答案 2 :(得分:3)
文档中关于使用AddConsole(this ILoggingBuilder builder)
的建议是正确的,但是要使其正常工作,您需要添加对NuGet包 Microsoft.Extensions.Logging.Console
的引用。
答案 3 :(得分:3)
根据为此在GitHub上打开的问题,如果您在Program.cs中使用CreateDefaultBuilder()方法,则已经在调用替换方法。
https://github.com/aspnet/Docs/issues/9829
我唯一的问题是,我仅在非生产环境中打开了这些文件。.并且看不到这样做的方法。
答案 4 :(得分:2)
不用担心-这就是dumbest thing ever!
注意
以下代码示例使用ConsoleLoggerProvider构造函数 在2.2版中已废弃。适当的替代品 过时的日志记录API将在3.0版中提供。在里面 同时,可以忽略并禁止显示警告。
万一您以为忘记了Obsolete的意思,那么您就没有了!不用担心,现在就忽略它-或取消警告(很抱歉,我没有相应的代码)。
(希望他们对这样做的原因做出更好的解释-这就是我的意思。)
答案 5 :(得分:0)
如果您无权访问LoggerFactory.Create()
,使用仍可以将ILoggerFactory
与AddProvider()方法一起使用,并为其提供一个ConsoleLoggerProvider(),但这有点如果您想做一些简单的事情,那会很痛苦。问题是,ConsoleLoggerProvider()
需要一个IOptionsMonitor <ConsoleLoggerOptions>作为参数,如果需要,这是最简单的事情
IOptionsMonitor<>
不匹配,或者是创建一个虚拟类:
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)));