Управление конфигурацией ведения журнала с помощью NLog в .NET Core 3

Я использую NLog в служебном приложении.NET Core 3.1. Следуя руководству по NLog, я вставил файл nlog.config для управления конфигурацией.

Теперь я запутался, потому что у меня есть три пункта, где я настраиваю ведение журнала:

1. In the code where I need to create a logger in a dependency injection 
context

// 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. In appSettings.json

  {
     "Logging": {
     "IncludeScopes": false,
     "LogLevel": {
     "Default": "Trace",
     "System": "Trace",
     "Microsoft": "Trace"
    }
  }
}

3. in NLog.config

The default config file produced by the nuget package installation:

<!-- 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, файл журнала не будет создан. Остальные изменения шва не повлияют.

Как связаны эти конфигурации? Как лучше всего включить / выключить логирование и выставить уровень?

3 ответа

Решение

Люди, решившие использовать NLog, обычно также хотят отключить всю MEL-фильтрацию, чтобы избежать путаницы с двумя системами фильтрации. Таким образом, вики-руководство NLog нацелено на этих пользователей.

Думаю, люди, которые в первую очередь используют 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: https://www.nuget.org/packages/Microsoft.Extensions.Logging.Configuration/

AddNLog регистрирует NLog, как любой другой Microsoft Extension Logger (MEL) LoggingProvider (аналогично AddConsole).

Это означает, что NLog получает вывод журнала только, который был "одобрен" MEL-ILogger. Таким образом, любая фильтрация, настроенная в MEL, предотвратит попадание logevents в NLog.

NLog по-прежнему имеет возможность перенаправлять на требуемые цели NLog на основе имен регистраторов и уровня важности LogLevel.

Вы можете решить, хотите ли вы использовать MEL-Filtering или NLog-Filtering, или их комбинацию. Но если вы просто хотите использовать "чистый" NLog, просто создайте экземплярNLog.Extensions.Logging.NLogLoggerFactory. Это специализированный ILoggerFactory, который игнорирует MEL-Filtering-Configuration.

Кстати. немного странно, что вы создаете изолированный LoggerFactory для каждого экземпляра CommandsJob. Можно подумать, что вы зарегистрируете тип в структуре внедрения зависимостей и позволите ему вводить параметры конструктора. См. Также этот пример:

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

Где LoggerFactory создается с AddLogging(...) и где Runnerзарегистрирован в ServiceCollection для внедрения зависимостей. При создании экземпляраRunner тогда инъекция зависимостей автоматически предоставит ILogger как параметр-конструктор.

Обратитесь к этому URL-адресу. Вы получите полное представление о Nlog в ядре asp net

https://www.c-sharpcorner.com/article/introduction-to-nlog-with-asp-net-core2/

Другие вопросы по тегам