在.NET Core 3中使用NLog管理日志记录配置

时间:2020-01-08 14:45:23

标签: .net-core nlog ilogger

我在.NET Core 3.1辅助服务应用程序中使用NLog。 在NLog教程之后,我插入了一个nlog.config文件来管理配置。

现在我很困惑,因为我在配置日志记录的三个方面:

  1. 在需要在依赖项注入上下文中创建记录器的代码中

    // Other code...
    
    services.AddScoped<IApplyJcdsCommandsJob, ApplyJcdsCommandsJob>(provider =>
    {
        var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder
                .ClearProviders()
                .AddFilter("Microsoft", Microsoft.Extensions.Logging.LogLevel.Trace)
                .AddFilter("System", Microsoft.Extensions.Logging.LogLevel.Trace)
                .AddFilter("ApplyJcdsCommandsJob", Microsoft.Extensions.Logging.LogLevel.Trace)
                //.AddConsole()
                //.AddEventLog();
                .AddNLog(configuration);
        });
    
        Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger<CommandsJob>();
    
        return new CommandsJob(logger);
    })
    
    // Other code...
    
  2. 在appSettings.json中

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Trace",
          "System": "Trace",
          "Microsoft": "Trace"
        }
      }
    }
    
  3. 在NLog.config中

    nuget软件包安装产生的默认配置文件:

    <!-- a section of the config -->
    <targets>
        <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    </targets>
    
    <rules>
        <logger name="*" minlevel="Trace" writeTo="f" />
    </rules>
    <!-- ... -->
    

我看到的是,如果删除Nlog.config文件,将不会创建日志文件。 其他更改接缝无效。

此配置如何关联? 开启/关闭日志记录并设置级别的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

决定使用NLog的人们通常还希望禁用所有MEL过滤,以避免与两个过滤系统混淆。因此NLog wiki-tutorial是针对这些用户的。

我想最先成为MEL用户的人可能只会使用new HostBuilder().CreateDefaultBuilder().Build()(将在启用所有枪支的情况下设置一切)。

但是如果只考虑简单的示例,则需要删除:

loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);

并添加:

loggingBuilder.AddConfiguration(config.GetSection("Logging"));

所以看起来像这样:

serviceCollection.AddLogging(loggingBuilder =>
{
   loggingBuilder.ClearProviders();
   loggingBuilder.AddConfiguration(config.GetSection("Logging"));
   loggingBuilder.AddNLog(config);
})

ILoggingBuilder.AddConfiguration可在Nuget找到:Microsoft.Extensions.Logging.Configuration

答案 1 :(得分:1)

AddNLog像其他任何Microsoft Extension Logger(MEL)LoggingProvider一样注册NLog(类似于AddConsole)。

这意味着NLog仅获得MEL-ILogger“批准”的日志输出。因此,在MEL中配置的任何过滤都将阻止日志事件到达NLog。

NLog仍然能够基于Logger名称和LogLevel严重性重定向到所需的NLog目标。

您可以决定是否要使用MEL过滤或NLog过滤,或两者结合使用。但是,如果您只想使用“纯” NLog,则只需创建NLog.Extensions.Logging.NLogLoggerFactory的实例。这是一个专门的ILoggerFactory,它忽略了MEL-Filtering-Configuration。

顺便说一句。您为每个CommandsJob实例创建一个隔离的LoggerFactory有点奇怪。会认为您将在依赖项注入框架中注册该类型,并让其注入构造函数参数。另请参见以下示例:

https://github.com/NLog/NLog.Extensions.Logging/blob/master/examples/NetCore2/ConsoleExample/Program.cs

其中LoggerFactory是使用AddLogging(...)创建的,而Runner已在ServiceCollection中注册以进行依赖项注入。创建Runner的实例时,依赖项注入将自动提供ILogger作为构造函数参数。