如何修复过时的 ILoggerFactory 方法?

How to fix obsolete ILoggerFactory methods?

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

这使用了 '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 的污染...

文档中使用 AddConsole(this ILoggingBuilder builder) 的建议是正确的,但要使其正常工作,您需要添加对 NuGet 包的引用 Microsoft.Extensions.Logging.Console

根据在 GitHub 上为此打开的问题,如果您在 Program.cs.

中使用 CreateDefaultBuilder() 方法,则替换方法已经被调用

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

我遇到的唯一问题是我只在非生产环境中启用了这些功能..并且看不到今后这样做的方法。

别担心 - 这是 dumbest thing ever!

Note

The following code sample uses a ConsoleLoggerProvider constructor that has been obsoleted in version 2.2. Proper replacements for obsolete logging APIs will be available in version 3.0. In the meantime, it is safe to ignore and suppress the warnings.

万一您认为自己忘记了 Obsolete 的意思 - 您没有!别担心,暂时忽略它 - 或者取消警告(抱歉,我手头没有相关代码)。

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

我在将日志记录代码从 .Net Core 2.1 更新到 3.0 时收到了同样的警告。推荐的升级方式是 documented on MSDN.

就我而言,我试图为控制台获取一个 LoggerFactory 实例,这在 .Net Core 3.0 中非常简单:

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

如果您无法访问 LoggerFactory.Create(),仍然可以使用带有 AddProvider() method giving it a ConsoleLoggerProvider() but it is a bit of a pain if you want to do something simple. The problem is, ConsoleLoggerProvider() requires a IOptionsMonitor<ConsoleLoggerOptions> 的 ILoggerFactory 作为参数,如果您

  • 您无权访问代码库中的选项机制(我的问题),或者
  • 您现有代码库中的实物期权机制与 IOptionsMonitor<>
  • 不匹配
  • 您有其他原因不使用 ASP.Net 选项设施

是创建一个虚拟class:

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)));