"ILoggerFactory"没有包含"AddConsole"的定义。

92
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()”方法的错误?我该如何解决?


可能是如何修复过时的ILoggerFactory方法?的重复问题。 - golobitch
我的问题可能很愚蠢,但是你有检查过你使用的using语句中是否包含了AddConsole方法的定义吗? - Romain Reboulleau
对于.NET Core 5,我遇到了这个问题,因为我忽略了添加正确的包。Install-Package Microsoft.Extensions.Logging.Console解决了我的问题。 - patrickmdnet
11个回答

139

我刚刚在 Pluralsight 上参加课程时遇到了这个问题。在下一个解释 ILoggerFactory.Create 中为什么 .AddConsole 能正常工作之前,我就过早地进入了下一步。

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

dotnet add package Microsoft.Extensions.Logging.Console

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

using Microsoft.Extensions.Logging;

11
我不喜欢扩展方法。 - Rei Miyasaka
2
如果我的Intellisense没有完全崩溃,这个必要性在小版本更新中似乎是绝对武断的。我正在查看两个不同的项目,分别引用5.0.8和5.0.12,前者需要它,而后者则不需要。 - Beltway
1
如果像我一样在寻找缺失的.AddDebug()时,请考虑使用Microsoft.Extensions.Logging.Debug包。 - Ekus

40

这里有一个独立的问题,之前AddConsole()方法需要一个ILoggerFactory参数作为签名,但是现在已经更改为ILoggerBuilder,这也可以从错误信息中看出。

现在似乎有一种新的方式来创建一个Console日志记录器:

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


30

尝试在core 3.0中使用ServiceCollection来配置日志记录

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

8

使用.NET Core 3.0添加控制台日志记录的方法与之前有所不同,需要使用LoggerFactory.Create()进行添加。 在此查看Microsoft文档


3
即使是微软提供的示例也无法正常工作。 - Charles Okwuagwu
1
在这个例子中,你是否收到了错误信息?或者有什么问题无法正常工作吗?提供一些信息会更好,这样我们可以帮助你,而不是直接给你一个负评。 - CLoc
1
你引用的来自 Microsoft 文档的示例直接列出 AddConsole() 未找到。 - Charles Okwuagwu
5
如果你遇到了如上所提到的AddConsole()未找到的情况,请在你的csproj中添加对Microsoft.Extensions.Logging.Console的引用,这样就可以解决问题了。 - Willem Ellis

7

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

2
只要包含额外的NuGet包,这个就可以工作了。Microsoft.Extensions.Logging.Console - DubMan
怎么能指望任何人弄清楚这个?疯狂。 - Grant Birchmeier
任何人都能指望弄清楚这个吗?疯了 - undefined

4
在使用Uno平台和VS2019时,我在生成的代码中遇到了这个错误。由于代码是自动生成的,并且只有在我将Nuget包更新到它们的最新版本后才出现了错误,因此很容易发现罪魁祸首:
Microsoft.Extensions.Logging.Console包的初始版本为1.1.1,而目前最新版本为5.0.0。 将其降级回1.1.1可以解决该问题。虽然我没有验证,但在5.0.0之前的任何版本可能也能解决该问题。
因此,将Microsoft.Extensions.Logging.Console降级到5.0.0之前的适当版本应该可以解决该问题。

4
如果您没有访问LoggerFactory.Create()的权限,仍然可以使用ILoggerFactoryAddProvider()方法,并给它提供一个ConsoleLoggerProvider(),但如果您想要做一些简单的事情,则有点麻烦。问题是,ConsoleLoggerProvider()需要一个IOptionsMonitor<ConsoleLoggerOptions>作为参数,如果您:

  • 在代码库中没有访问选项机制(我的问题),或者
  • 现有代码库中的真实选项机制与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

我也遇到了同样的问题,我不得不在我的.csproj文件中添加以下内容并重新构建解决方案:

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

这在我的情况下解决了问题。


2

我曾经遇到过同样的问题,但即使在我的.csproj中添加了包引用,也无法安装扩展。最终我只好前往NuGet网站上的Microsoft.Extensions.Logging.Console,并在包管理器控制台上使用以下命令:dotnet add package Microsoft.Extensions.Logging.Console,因为它对我来说很有效。

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

0
如果你有一个
private static ILoggerFactory LoggerFactory { get; set; }

不是

private static LoggerFactory LoggerFactory { get; set; }

您会因为来自先前版本的dotnet的注入依赖而收到错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接