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

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

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

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

'ILoggerFactory' does not contain a definition for 'AddConsole' and the best extension method overload 'ConsoleLoggerExtensions.AddConsole(ILoggingBuilder)' requires a receiver of type '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()?我该如何解决这个问题?

对于 .NET Core 3.0,添加控制台日志记录是完全不同的。 您必须使用 LoggerFactory.Create() 来添加它。 look microsoft docs here

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

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

我刚刚 运行 学习了关于 Pluralsight 的课程。在下一张幻灯片解释为什么他们的 .AddConsole 在 ILoggerFactory.Create.

即使您的 class 中只需要 using Microsoft.Extensions.Logging,您也需要显式添加对 .Net Core 应用程序的包引用,以便找到 .AddConsole 方法。

dotnet add package Microsoft.Extensions.Logging.Console

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

using Microsoft.Extensions.Logging;

有一个单独的问题在起作用,之前 AddConsole() 的签名需要一个 ILoggerFactory,现在已更改为 ILoggerBuilder,如错误消息中所暗示的那样。

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

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

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

<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

如果您无法访问 LoggerFactory.Create(),仍然可以使用带有 AddProvider() method giving it a ConsoleLoggerProvider() but it is a bit of a pain if you want to do something simple. The problem is, ConsoleLoggerProvider() requires a IOptionsMonitor<ConsoleLoggerOptions> 的 ILoggerFactory 作为参数,如果您

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

是创建一个虚拟class:

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之前的任何版本也可能解决这个问题,虽然我没有验证。

所以为 Microsoft.Extensions.Logging.Console 降级到 5.0.0 之前的合适版本应该可以解决这个问题。

如果你有

private static ILoggerFactory LoggerFactory { get; set; }

而不是

private static LoggerFactory LoggerFactory { get; set; }

由于旧版本的 dotnet 的注入依赖,您将收到此错误。

我在 .NET Core 5.0 中通过执行类似的操作解决了这个问题。 Example of console with dependency injection

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