Я использую Microsoft.Extensions.DependencyInjection в своем проекте и хочу использовать Microsoft.Extension.Logging с NLog в качестве фактической структуры ведения журнала.
Поскольку я хочу иметь возможность выбирать конфигурацию ведения журналаПри запуске программно (чтобы обойти проблемы с маршрутизацией) я делаю что-то вроде этого:
var config = new LoggingConfiguration();
var dirPath = Path.Combine(publicStorage, "Test");
var logFileTarget = new NLog.Targets.FileTarget()
{
CreateDirs = true,
FileName = Path.Combine(dirPath, "test.log"),
FileNameKind = NLog.Targets.FilePathKind.Absolute,
Layout = "${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}",
Name = "FileLog",
};
//Add Logging Targets
config.AddTarget(logFileTarget);
//Add Rules
config.AddRuleForAllLevels(logFileTarget, "*", false);
LogManager.Configuration = config;
Но это не настраивает те регистраторы, возвращаемые ServiceProvider.GetService<ILogger<T>>
.Однако, если я использую LogManager.GetLogger("TestLogger")
Ведение журнала настроено так, как и ожидалось.
LogManager.ReconfigExistingLoggers();
также не решает проблему, и мой поиск оказался пустым
Редактировать
Настройка DI выглядит следующим образом:
return new ServiceCollection()
// Configure Logging Provider
.AddLogging(builder =>
{
builder.AddDebug();
//Add NLog
builder.AddNLog(new NLogProviderOptions()
{
CaptureMessageTemplates = true,
CaptureMessageProperties = true,
});
})
... // Registering additional dependencies
.BuildServiceProvider();
Использование LogManager.GetCurrentClassLogger
дает такое же «неправильное поведение», как и в случае с регистраторами, возвращаемыми serviceProvider.Так как правило настроено на "*"
, я ожидал бы, что все логгеры, в том числе использующие имена классов, перехвачены этим правиломILogger по сообщениям di все еще существует