11

我在 .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 文件,将不会创建日志文件。其他更改接缝没有效果。

这些配置有什么关系?打开/关闭日志记录和设置级别的最佳方法是什么?

4

2 回答 2

10

决定使用 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

于 2020-01-16T20:27:51.523 回答
5

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

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

NLog 仍然能够根据 Logger-names 和 LogLevel-severity 重定向到想要的 NLog-targets。

您可以决定是否要使用 MEL-Filtering 或 NLog-Filtering,或两者的组合。但是,如果您只想使用“纯”NLog,那么只需创建一个NLog.Extensions.Logging.NLogLoggerFactory. 它是一个忽略 MEL-Filtering-Configuration 的专用 ILoggerFactory。

顺便提一句。为每个 CommandsJob 实例创建一个隔离的 LoggerFactory 有点奇怪。会认为你会在依赖注入框架中注册类型,并让它注入构造函数参数。另请参阅此示例:

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

LoggerFactory 的创建AddLogging(...)位置以及Runner在 ServiceCollection 中为依赖注入而注册的位置。在创建实例时,Runner依赖注入将自动提供ILogger为构造函数参数。

于 2020-01-08T20:20:56.297 回答