c# - 如何在控制台应用程序中配置 ConsoleLogger?
问题描述
我正在尝试使用 .NET CORE 3.1 构建控制台应用程序,但在注入控制台记录器时遇到问题。
在最近的版本中,注入日志记录的方式似乎发生了重大变化,并且各种风格的教学教程似乎都与我正在尝试做的事情相匹配。
我有一个界面:
public interface IMyDoer
{
void DoSomething();
}
还有一个我想注入 ILogger 的类:
public class MyDoer : IMyDoer
{
private readonly ILogger logger;
public MyDoer(ILogger logger)
{
this.logger = logger;
}
public void DoSomething()
{
this.logger.Log(LogLevel.Information, "Doing something");
}
}
然后我有我的 Main(),我试图在其中配置一个 DI 容器来构造一个 Doer 对象,配置 ILogger 以登录到控制台。
public class Program
{
public static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
var serviceProvider serviceCollection.BuildServiceProvider();
var myDoer = serviceProvider.GetService<IMyDoer>();
myDoer.DoSomething();
}
private static void ConfigureServices(ServiceCollection serviceCollection)
{
serviceCollection.AddLogging(configure => {
configure.AddConsole();
});
serviceCollection.AddSingleton<IMyDoer, MyDoer>();
}
}
作为替代方案,我尝试过:
public class Program
{
static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
using (var serviceProvider = serviceCollection.BuildServiceProvider())
using (var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()))
{
var myDoer = serviceProvider.GetService<IMyDoer>();
myDoer.DoSomething();
}
}
private static void ConfigureServices(ServiceCollection serviceCollection)
{
serviceCollection
.AddSingleton<IMyDoer, MyDoer>();
}
}
无论哪种情况,我都会遇到异常:
System.InvalidOperationException
HResult=0x80131509
Message=Unable to resolve service for type 'Microsoft.Extensions.Logging.ILogger' while attempting to activate 'MyDoer.DoSomething'.
Source=Microsoft.Extensions.DependencyInjection
关于我应该如何做的任何想法?
解决方案
ILogger
未向 ASP.NET Core DI 容器注册。相反,使用ILogger<T>
:
public class MyDoer : IMyDoer
{
private readonly ILogger<MyDoer> logger;
public MyDoer(ILogger<MyDoer> logger)
{
this.logger = logger;
}
// ...
}
ILogger<T>
使用类型名称 ( YourNamespace.MyDoer
) 作为日志类别:
该类别包含在该实例创建的每条日志消息中
ILogger
。
要设置您自己的日志类别并创建您自己的实现ILogger
,请使用ILoggerFactory
:
public class MyDoer : IMyDoer
{
private readonly ILogger logger;
public MyDoer(ILoggerFactory loggerFactory)
{
this.logger = loggerFactory.CreateLogger("YourCategory");
}
// ...
}
推荐阅读
- reactjs - 提交表单时,React 应用程序无法按预期工作
- android - 运行模拟器时Android Studio不会显示图像不断抛出错误
- python - TSP [最近邻] - 给定距离矩阵
- amazon-web-services - 模式匹配供应商文件夹的代码部署 appspec.yml 权限规范
- firebase-authentication - CouchDB 用来加密密码的“简单”散列算法是什么?
- flutter - Flutter Swiper:如何在左对齐时在一页上显示多个小部件?
- javascript - 如何检查字符串是否有元音?
- javascript - 如何在 Chrome JS 控制台中下载文件 url 列表
- javascript - 为什么数组中的某些声音没有暂停?
- python - PyDub:缺少 ffmpeg 标头