关于c#:如何修复过时的ILoggerFactory方法?

How to fix obsolete ILoggerFactory methods?

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

1
2
3
4
5
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文件并添加类似以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
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",如下所示:

1
2
3
4
5
6
7
8
9
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的引用。


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

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

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


不用担心-这是有史以来最愚蠢的事情!

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.

万一您以为忘记了过时的意思-您没有!不用担心,现在就忽略它-或取消警告(对不起,我没有相应的代码)。

(希望他们对这样做的原因做出更好的解释-这就是我的意思。)


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

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

我唯一的问题是,我仅在非生产环境中打开了这些功能,。并且没有办法继续前进。


如果您没有访问LoggerFactory.Create()的权限,则仍可以将ILoggerFactory与AddProvider()方法一起使用,为它提供一个ConsoleLoggerProvider(),但是如果您想做一些简单的事情会有些麻烦。问题是,ConsoleLoggerProvider()需要IOptionsMonitor 作为参数,并且如果您要

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

是创建一个虚拟类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

1
2
3
factory.AddProvider(
    new ConsoleLoggerProvider(
        new DummyConsoleLoggerOptionsMonitor(LogLevel.Debug)));