Можно ли программно настроить NLog при использовании с Microsoft.Extensions.DependencyInjection? - PullRequest
0 голосов
/ 19 февраля 2019

Я использую 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 все еще существует

1 Ответ

0 голосов
/ 23 февраля 2019

Запомните пропавшее без вести:

builder.SetMinimumLevel(LogLevel.Trace);

См. Также вики: https://github.com/NLog/NLog.Extensions.Logging/wiki/Getting-started-with-.NET-Core-2---Console-application#32-setup-the-dependency-injector-di-container

...