'ILoggerFactory' does not contain a definition for 'AddConsole'

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

I have found the piece of code above on Github. It gives the following error:

'ILoggerFactory' does not contain a definition for 'AddConsole' and the best extension method overload 'ConsoleLoggerExtensions.AddConsole(ILoggingBuilder)' requires a receiver of type 'ILoggingBuilder'

I'm using NET Core 3.0 and I have the following NuGet packages installed.

<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" />

Why do I get that ILoggerFactory does not have the method AddConsole()? How can I fix this?

46810 次浏览

对于.NET Core 3.0,添加控制台日志记录是完全不同的。 您必须使用 LoggerFactory. Create ()来添加这个。 看看这里的微软文档

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

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

我刚在学习 Pluralsight 的课程时碰到了这个。在下一张幻灯片解释为什么他们。AddConsole 在 ILoggerFactory 中工作。创造。

即使在类中只需要 using Microsoft.Extensions.Logging,也需要显式地向。网络核心应用程序的顺序。要找到的 AddConsole 方法。

dotnet add package Microsoft.Extensions.Logging.Console

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

using Microsoft.Extensions.Logging;

这里有一个单独的问题,之前 AddConsole ()的签名期望一个 ILoggerFactory,现在已经更改为 ILoggerBuilder,正如错误消息中所暗示的那样。

下面看起来是一种新的方法来支持一个新的 Console 日志记录器:

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

我的应用程序也有同样的问题,我必须添加

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

并重新构建解决方案。它修复了我的问题。

我有同样的问题,但无法安装的扩展,即使我添加了包引用我的。取而代之的是 csproj,我只是访问了 微软。扩展。日志记录。控制台的 nuget 站点,并在 Package Manager Console 上使用这个命令作为 dotnet add Package Microsoft。分机。伐木。控制台对我不起作用。

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

如果你没有访问 LoggerFactory.Create(),使用仍然可以使用 ILoggerFactoryAddProvider ()方法给它一个 Console LoggerProvider (),但它是一个有点痛苦,如果你想做一些简单的事情。问题是,ConsoleLoggerProvider()需要一个 IOptionsMonitor < Console LoggerOptions > 作为参数,而且如果您

  • 您无法访问代码库中的选项机制(我的问题) ,或者
  • 现有代码库中的实际选项机制与 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 的初始版本。分机。伐木。控制台软件包是1.1。目前最新的版本是5.0。回到1.1.1修复了这个问题。可能在5.0.0之前的任何版本也会修复这个问题,尽管我没有验证。

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

如果你有一个

private static ILoggerFactory LoggerFactory { get; set; }

而不是

private static LoggerFactory LoggerFactory { get; set; }

由于注入依赖于以前版本的 dotnet,您将得到这个错误。

在.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!");
}