在ASP.NET Core 2中,当我们谈论日志记录时,仅通过ILoggerFactory.AddProvider()
注册提供者或使用适当的扩展方法就足够了。然后,您就可以解析ILogger<T>
(未注册已关闭的ILogger<>
)。我在ILoggerFactory.CreateLogger<T>
调用和实际ILogger<T>
分辨率之间的桥梁上挣扎:似乎某处魔法发生了,但我找不到位置。
有任何想法吗?
答案 0 :(得分:6)
一切都始于ConfigureLogging
:
public static IWebHostBuilder ConfigureLogging(
this IWebHostBuilder hostBuilder,
Action<ILoggingBuilder> configureLogging)
{
return hostBuilder.ConfigureServices(
collection => collection.AddLogging(configureLogging));
}
这里的重要性呼吁是AddLogging
。我不会在这里包含整个函数,但注册过程如下所示:
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>)));
如上所示,the ASP.NET Core Dependency Injection container allows for the registration of open generics。
最后,Logger<T>
的{{3}}如下所示:
public Logger(ILoggerFactory factory)
{
// ...
_logger = factory.CreateLogger(TypeNameHelper.GetTypeDisplayName(typeof(T)));
}
Logger<T>
类的其余部分只是非通用_logger
的直通,现在包含T
类型的名称。