'ILoggerFactory'不包含'AddConsole'的定义


private ILoggerFactory ConfigureLogging(ILoggerFactory factory)
{
factory.AddConsole();
return factory;
}

我在Github上找到了上面的代码段。它给出以下错误:

"ILoggerFactory"不包含"AddConsole"的定义,最佳扩展方法重载"ConsoleLoggerExtensions.AddConsole(ILoggingBuilder("需要类型为"ILoggingBuilder"的接收器

我使用的是 NET Core 3.0,并且安装了以下 NuGet 包。

<PackageReference Include="Discord.Net" Version="2.1.1" />
<PackageReference Include="Discord.Net.Commands" Version="2.1.1" />
<PackageReference Include="Discord.Net.WebSocket" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.0" />

为什么我得到ILoggerFactory没有方法AddConsole()?我该如何解决这个问题?

我只是在Pluralsight课程之后遇到了这个问题。在下一张幻灯片解释为什么他们的.AddConsole 在 ILoggerFactory.Create 中工作。

即使类中只需要using Microsoft.Extensions.Logging,也需要显式添加对 .Net Core 应用的包引用,以便 .要找到的添加控制台方法。

dotnet add package Microsoft.Extensions.Logging.Console

并将此 using 语句添加到您的代码中

using Microsoft.Extensions.Logging;

还有一个单独的问题在起作用,以前 AddConsole(( 的签名需要一个 ILoggerFactory,后来变成了 ILoggerBuilder,正如错误消息中所暗示的那样。

以下似乎是建立新控制台记录器的新方法:

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

尝试使用 ServiceCollection 在核心 3.0 中配置日志记录

private IServiceCollection ConfigureLogging(IServiceCollection factory)
{
factory.AddLogging(opt =>
{
opt.AddConsole();
})
return factory;
}

在 .NET Core 3.0 中,添加控制台日志记录是完全不同的。 你必须使用 LoggerFactory.Create(( 来添加它。 在此处查看微软文档

这是在 .NET Core 5.0 中通过做这样的事情为我解决的。具有依赖关系注入的控制台示例

public static void Main(string[] args)
{
//setup our DI
var serviceProvider = new ServiceCollection()
.AddLogging(c => c.AddConsole(opt => opt.LogToStandardErrorThreshold = LogLevel.Debug))
.AddSingleton<IFooService, FooService>()
.AddSingleton<IBarService, BarService>()
.BuildServiceProvider();
var logger = serviceProvider.GetService<ILoggerFactory>()
.CreateLogger<Program>();
logger.LogDebug("Starting application");
//do the actual work here
var bar = serviceProvider.GetService<IBarService>();
bar.DoSomeRealWork();
logger.LogDebug("All done!");
}

如果您无法访问LoggerFactory.Create(),则仍然可以将ILoggerFactory与AddProvider((方法一起使用,从而为其提供ConsoleLoggerProvider((,但是如果您想做一些简单的事情,这有点痛苦。问题是,ConsoleLoggerProvider()需要一个IOptionsMonitor作为参数,如果你

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

我在使用 VS2019 的 Uno 平台时在生成的代码中遇到了此错误。 由于代码是生成的,并且错误仅在我将Nuget包更新到最新版本后发生,因此很容易发现罪魁祸首:

Microsoft.Extensions.Logging.Console 包的初始版本是 1.1.1。此时最新的是 5.0.0。恢复到 1.1.1 修复了该问题。尽管我没有验证,但 5.0.0 之前的任何版本也可能解决此问题。

因此,降级到5.0.0之前的合适版本以Microsoft.Extensions.Logging.Console应该可以解决此问题。

我的应用程序遇到了同样的问题,我不得不添加

<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="3.1.0"/>

到我的 .csproj 文件并重新生成解决方案。它解决了我的问题。

我遇到了同样的问题,但即使我在 .csproj 上添加包引用也无法安装扩展,我只是去了 Microsoft.Extensions.Logging.Console 的 nuget 站点并在包管理器控制台上使用此命令,因为 dotnet 添加包Microsoft.Extensions.Logging.Console 对我不起作用。

Install-Package Microsoft.Extensions.Logging.Console -Version 3.1.5

如果你有一个

private static ILoggerFactory LoggerFactory { get; set; }

而不是

private static LoggerFactory LoggerFactory { get; set; }

由于以前版本的 dotnet 的注入依赖项,你将收到错误。

这对我来说很有用,基于如何使用 ConsoleLoggerProvider 创建 LoggerFactory?

var configureNamedOptions = new ConfigureNamedOptions<ConsoleLoggerOptions>("", null);
var optionsFactory = new OptionsFactory<ConsoleLoggerOptions>(new[] { configureNamedOptions }, Enumerable.Empty<IPostConfigureOptions<ConsoleLoggerOptions>>());
var optionsMonitor = new OptionsMonitor<ConsoleLoggerOptions>(optionsFactory, Enumerable.Empty<IOptionsChangeTokenSource<ConsoleLoggerOptions>>(), new OptionsCache<ConsoleLoggerOptions>());
loggerFactory.AddProvider(new ConsoleLoggerProvider(optionsMonitor));

相关内容

  • 没有找到相关文章

最新更新