这可能与将ILogger或ILoggerFactory传递给AspNet Core?中的构造函数有关?,然而,这是关于库设计的,而不是关于使用这些库的实际应用程序如何实现其日志记录。
我正在写一篇文章。net标准2.0库将通过Nuget安装,为了让使用该库的人获得一些调试信息,我依赖于微软。扩展。登录中。允许注入标准化记录器的抽象。
然而,我看到了多个接口,web上的示例代码有时使用ILoggerFactory,并在类的ctor中创建一个记录器。还有ILoggerProvider,它看起来像工厂的只读版本,但实现可能实现也可能不实现这两个接口,所以我不得不选择。(工厂似乎比供应商更常见)。
我看到的一些代码使用非泛型ILogger
接口,甚至可能共享同一个记录器的一个实例,有些代码使用ILogger
现在,我确实认为
我很好奇我应该在这里做些什么,以使用户的头痛最少,同时如果需要的话,仍然允许适当的日志支持。
ILogger
您可以选择:
<代码>ILogger
有鉴于此,ILoggerProvider只是处理每个已注册日志消息的桥梁。没有必要使用它,因为它不会影响您应该干预代码的任何内容。它侦听注册的ILoggerProvider并处理消息。就是这样。
除了ILoggerProvider之外,这些都是有效的ILogger和ILogger
当您使用ILogger执行日志记录时,每个注册的ILogger提供者都有机会处理该日志消息。使用代码直接调用ILoggerProvider实际上是无效的。
我们有3个接口:ILogger
、
ILoggerProvider
和
ILoggerFactory
。让我们看看源代码以了解他们的职责:
ILogger:负责编写给定日志级别的日志消息。
ILogger Provider:负责创建ILogger的实例(您不应该直接使用ILogger Provider来创建记录器)
ILogger工厂:您可以向工厂注册一个或多个ILogger提供者,工厂反过来使用所有这些来创建ILogger的实例<代码>ILoggerFactory包含一组ILoggerProviders。
在下面的示例中,我们正在工厂注册2个提供程序(控制台和文件)。当我们创建记录器时,工厂使用这两个提供程序来创建记录器的实例:
ILoggerFactory factory = new LoggerFactory().AddConsole(); // add console provider
factory.AddProvider(new LoggerFileProvider("c:\\log.txt")); // add file provider
Logger logger = factory.CreateLogger(); // creates a console logger and a file logger
因此,记录器本身正在维护一个ILogger的集合,并将日志消息写入所有日志。查看Logger源代码,我们可以确认,Logger有一个ILogger数组(即,LoggerInformation[]
),同时它正在实现ILogger接口。
MS文档提供了两种注入记录器的方法:
1、工厂注射:
public TodoController(ITodoRepository todoRepository, ILoggerFactory logger)
{
_todoRepository = todoRepository;
_logger = logger.CreateLogger("TodoApi.Controllers.TodoController");
}
创建一个类别=TodoApi的记录器。控制器。TodoController。
2.注入通用的ILogger
public TodoController(ITodoRepository todoRepository, ILogger<TodoController> logger)
{
_todoRepository = todoRepository;
_logger = logger;
}
使用TodoController的Class=完全限定类型名称创建记录器
在我看来,让文档混淆的是,它没有提到任何关于注入非泛型的ILogger的内容。在上面的同一个例子中,我们注入了一个非泛型的ITodoRepository,但它并没有解释为什么我们对ILogger不这样做。
根据Mark Seemann的说法:
注入构造函数应该只接收依赖项。
将工厂注入控制器不是一种好方法,因为初始化记录器不是控制器的责任(违反SRP)。同时注入一个通用的ILogger
应该注入的(至少根据上面的文章)是非通用的ILogger,但这不是Microsoft内置DI容器所能做到的,您需要使用第三方DI库。这两个文档解释了如何使用第三方库。净核心。
这是尼古拉·马洛维奇的另一篇文章,他在文章中解释了国际奥委会的五条定律。
尼古拉IoC第四定律
被解析的类的每个构造函数除了接受一组自己的依赖项之外,不应该有任何实现。
我一直在尝试将. net核心库项目引用到我的Azure函数项目中,以调用. net核心类库中定义的进程之一。 net核心库项目使用ILogger。 但是,每当我尝试运行一个函数时,我都会收到以下错误: [2019/11/29 1:08:35 上午]“Function1”函数出错:Microsoft.Azure.WebJobs.Host:错误索引方法“Function1”。Microsoft.Azu
我有一个注册其服务的库: 而且,正如您可能看到的,我需要,因此它是此扩展方法的参数。 但是,由于该方法是在中使用的,我们没有方法在.NET5中实例化。如何将记录器传递给?
希望一些比我更了解Azure功能的人能提供帮助。 开箱即用,您可以使用应用程序设置中的APPINSIGHTS_INSTRUMENTATIONKEY设置登录到应用程序Insights...这将在基本级别记录函数请求,然后允许您执行等操作。 这只是被跟踪器或ilogger所掩盖。
我有一个使用应用程序洞察的.NET5Web应用程序。我尝试使用登录AI trace。然而:当分析Azure上AI中的“痕迹”内容时,日志并不显示。 启动部分: 应该进行日志记录的类的构造函数通过依赖注入来注入ILogger和AppInsights: 在该方法中,我有以下两个日志记录尝试: instrumentationkey存储在appsettings中(显然正确,因为telemetryClien
我正在直接测试控制台应用程序的代码:https://docs.microsoft.com/en-us/azure/azure-monitor/app/ilogger# 我基本上复制了代码,并将其指向一个新的azure app insights实例。然而,这些日志都没有出现在app Insights中。我错过什么了吗?