C# Asp.net核心:是否创建ILogger的新实例<;类型>;每个请求都很昂贵吗?
最近,我一直在根据我公司另一个团队编写的模板进行一个项目。该项目使用C# Asp.net核心:是否创建ILogger的新实例<;类型>;每个请求都很昂贵吗?,c#,asp.net-core,dependency-injection,nlog,C#,Asp.net Core,Dependency Injection,Nlog,最近,我一直在根据我公司另一个团队编写的模板进行一个项目。该项目使用asp.net core 2.2构建,并使用NLog作为ILogger的日志框架,该框架在ILogger工厂中注册 我注意到一个有趣的点,任何依赖于ILogger-logger的服务都会获得logger的一个新实例。该服务确实注册为transient,因此每个请求创建该服务似乎是正常的,但据我所知,对于该服务的所有实例,logger将是相同的(即singelton)实例 我不能上传所有的代码,好像它是大的和私人的。但似乎相关的线
asp.net core 2.2
构建,并使用NLog
作为ILogger
的日志框架,该框架在ILogger工厂中注册
我注意到一个有趣的点,任何依赖于ILogger-logger
的服务都会获得logger
的一个新实例。该服务确实注册为transient
,因此每个请求创建该服务似乎是正常的,但据我所知,对于该服务的所有实例,logger
将是相同的(即singelton
)实例
我不能上传所有的代码,好像它是大的和私人的。但似乎相关的线路是:
public static IWebHostBuilder CreateBuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder<Startup>(args).UseUnityServiceProvider()
.ConfigureAppConfiguration((hostingContext, configurationBuilder) =>
{
//...
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
LoadExternalNLogConfigFile(hostingContext);
})
.UseNLog(); // NLog: setup NLog for Dependency injection
}
公共静态IWebHostBuilder CreateBuildWebHost(字符串[]args)
{
返回WebHost.CreateDefaultBuilder(args.UseUnityServiceProvider())
.ConfigureAppConfiguration((hostingContext,configurationBuilder)=>
{
//...
})
.ConfigureLogging((hostingContext,logging)=>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConfiguration(hostingContext.Configuration.GetSection(“logging”));
LoadExternalNLogConfigFile(hostingContext);
})
.UseNLog();//NLog:为依赖项注入设置NLog
}
以及:
private static void LoadExternalNLogConfigFile(WebHostBuilderContext hostingContext)
{
var isRunningInContainer = hostingContext.Configuration.GetValue<bool>("DOTNET_RUNNING_IN_CONTAINER");
var xmlNLogConfigFilenameWithEnvName =
$"nlog.{(isRunningInContainer ? "Docker." : "")}{hostingContext.HostingEnvironment.EnvironmentName}.config";
var xmlNLogConfigFilename = $"nlog.{(isRunningInContainer ? "Docker." : "")}config";
try
{
hostingContext.HostingEnvironment.ConfigureNLog(xmlNLogConfigFilenameWithEnvName);
}
catch
{
hostingContext.HostingEnvironment.ConfigureNLog(xmlNLogConfigFilename);
}
}
private static void loadexternalnlogconfig文件(WebHostBuilderContext hostingContext)
{
var isrunningcontainer=hostingContext.Configuration.GetValue(“DOTNET\u在容器中运行”);
变量xmlNLogConfigFilenameWithEnvName=
$“nlog.{(IsRunningContainer?“Docker.”:“)}{hostingContext.HostingEnvironment.EnvironmentName}.config”;
var xmlNLogConfigFilename=$“nlog.{(isRunningContainer?“Docker.”:“)}config”;
尝试
{
hostingContext.HostingEnvironment.ConfigureNLog(xmlNLogConfigFilenameWithEnvName);
}
抓住
{
hostingContext.HostingEnvironment.ConfigureNLog(xmlNLogConfigFilename);
}
}
为了检查记录器
实例的相等性,我使用了所描述的解决方案
我还测试了Nlog
“Hello world”项目,如指南所示。测试表明,每个请求的记录器实例都是相同的
我的问题:为每个对象请求创建一个新的ILogger
实例是否花费昂贵?我应该为这个问题寻找解决方案,还是这是一个可以忽略不计的问题?快速回答是肯定的:这会很昂贵
然而,没有理由这样做。任何日志系统都将在IoC容器中创建作为单例的记录器,或在ILoggerFactory
实现中为该类别回收记录器。主要的一点是,这不是你应该担心的事情。只需在启动时配置日志,然后将ILogger
注入控制器和其他服务。日志基础设施将使用DI magic为您管理记录器的重用。“这是一个可以忽略的问题吗”-只有您可以通过对应用程序进行基准测试来判断,我们不知道您在做什么,因此无法真正判断。话虽如此,如果这是一个昂贵的操作,那么到目前为止会有很多关于它的投诉……你可以在来源中看到@DavidG I无法显示该程序。我的问题是,如果您的应用程序中有许多服务(即对象)依赖于ILogger,并且这些服务使用ILogger的新实例创建了每个请求,那么它是否会对我的web应用程序产生重大影响(使用NLog时)?@stuartd谢谢!这就是我要找的!如果缓存,则影响可能较小。