如何修复过时的 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<MyClass> 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 作为库吗?