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