如何修复过时的 ILoggerFactory 方法?

Posted

技术标签:

【中文标题】如何修复过时的 ILoggerFactory 方法?【英文标题】:How to fix obsolete ILoggerFactory methods? 【发布时间】:2019-05-19 07:12:08 【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

LoggerFactory 肯定不是LoggingBuilder,是吗? 日志记录是在WebHost 上设置的(我相信从 2.0 开始就是这样)。请参阅docs。如果您使用WebHost.CreateDefaultBuilder,则可以免费获得控制台日志记录。 【参考方案1】:

如果您无法访问LoggerFactory.Create(),仍然可以使用ILoggerFactory 和AddProvider() 方法给它一个ConsoleLoggerProvider(),但如果您想做某事,这有点痛苦简单的。问题是,ConsoleLoggerProvider() 需要一个 IOptionsMonitorConsoleLoggerOptions> 作为参数,如果你这样做是最简单的事情

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

【讨论】:

【参考方案2】:

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

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

using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()))

    // use loggerFactory

【讨论】:

最佳答案,因为它对 ASP.NET Core DI 基础架构并不严格。接受的将整个框架留在范围之外。 没错。我不得不更新我的日志记录扩展 nuget 以获得另一个依赖解决方案,突然它中断了,让我想“这次你把它移到哪里了”。这简洁地回答了它。 它在 .NET 5 中不起作用。ILoggerFactory 中没有 AddConsole 方法。【参考方案3】:

我今天也遇到了同样的问题。

从 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 中,但将日志内容从“配置”方法移动到“配置服务”,如下所示:

public void ConfigureServices(IServiceCollection services)

    services.AddLogging(loggingBuilder =>
    
        loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));
        loggingBuilder.AddConsole();
        loggingBuilder.AddDebug();
    );

也许可以减少 Program.cs 的污染...

【讨论】:

这还有必要吗(我的意思是AddLogging)?我刚刚创建了新的 Web API 项目,没有做任何事情。我只是通过参数注入ILogger&lt;MyClass&gt; logger 并且可以毫无问题地登录(显然在控制台中)。所以我想知道......为什么AddConsole 当您尝试从实际程序配置类库的日志记录时,如何执行 ConfigureServices 方法?【参考方案4】:

别担心 - 这是dumbest thing ever!

注意

以下代码示例使用 ConsoleLoggerProvider 构造函数 在 2.2 版中已被淘汰。适当的替代品 过时的日志记录 API 将在 3.0 版中提供。在里面 同时,忽略和抑制警告是安全的。

如果你认为你忘记了 Obsolete 的意思 - 你没有!不用担心,暂时忽略它 - 或取消警告(抱歉,我手头没有相应的代码)。

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

【讨论】:

不确定新的答案,因为 3.0 现已推出 - 所以如果您使用的是 3.0,那么这个答案本身现在已经过时了 ;-)【参考方案5】:

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

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

我唯一遇到的问题是我只为非生产环境启用了这些功能。并且看不到继续这样做的方法。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于如何修复过时的 ILoggerFactory 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ILoggerFactory 添加到启动 dotnet core 3.1

如何在 Visual Studio 中修复 RegisterClientScriptBlock 已过时警告

如何修复“'dexOptions(Action<DexOptions>): Unit' 已弃用。设置 dexOptions 已过时。”?

我应该将 ILogger、ILogger<T>、ILoggerFactory 或 ILoggerProvider 作为库吗?

log4j2(一) 获取 ILoggerFactory

如何永久修复升级到EF6后出现的“EdmFunctionAttribute is obsolete”警告?