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));