如何修复过时的ILoggerFactory方法?

时间:2018-12-18 20:07:29

标签: c# .net asp.net-core .net-core asp.net-core-2.2

我将项目升级到.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)。我以为这就是我正在使用的。

我在这里想念什么?

6 个答案:

答案 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(),使用仍可以将ILoggerFactoryAddProvider()方法一起使用,并为其提供一个ConsoleLoggerProvider(),但这有点如果您想做一些简单的事情,那会很痛苦。问题是,ConsoleLoggerProvider()需要一个IOptionsMonitor <ConsoleLoggerOptions>作为参数,如果需要,这是最简单的事情

  • 您无权访问代码库中的选项机制(我的问题),或者
  • 现有代码库中的实物期权机制与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)));