与Microsoft.Extensions.DependencyInjection一起使用时,是否可以通过编程方式配置NLog?

时间:2019-02-19 14:44:14

标签: c# dependency-injection .net-core nlog

我在我的项目中使用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>>返回的那些Logger。 但是,如果我使用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返回的Logger相同的“错误行为”。以来   该规则是使用"*"设置的,我希望所有记录器(包括使用类名的记录器)都被该规则捕获

最后一句话是不正确的,它实际上可以正常工作,但是仍然存在通过di消息不出现ILogger的情况

1 个答案:

答案 0 :(得分:1)