Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net核心:是否创建ILogger的新实例<;类型>;每个请求都很昂贵吗?_C#_Asp.net Core_Dependency Injection_Nlog - Fatal编程技术网

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谢谢!这就是我要找的!如果缓存,则影响可能较小。