Ядро Asp.net: стоит ли создавать новый экземпляр ILogger <Type>каждый запрос дорого? - PullRequest
0 голосов
/ 28 октября 2019

Недавно я работал над проектом на основе шаблона, написанного другой группой в моей компании. Этот проект построен с asp.net core 2.2 и использует NLog в качестве каркаса ведения журнала за ILogger, зарегистрированным в ILoggerFactory.

. Я заметил интересный момент, когда любая служба, зависящая от ILogger<service> 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
    }

И эти:

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);
        }
    }

Чтобы проверить равенство экземпляра logger, я использовал решенияописано здесь .

Я также протестировал Nlog проект "Hello world", как указано здесь . Тест показал, что экземпляр регистратора идентичен для каждого запроса.

Мой вопрос : Дорого ли стоит создание нового ILogger экземпляра для каждого запроса объекта? Нужно ли искать решение этой проблемы или это незначительная проблема?

...