Недавно я работал над проектом на основе шаблона, написанного другой группой в моей компании. Этот проект построен с 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
экземпляра для каждого запроса объекта? Нужно ли искать решение этой проблемы или это незначительная проблема?