Удалять консольные и отладочные журналы в ASP.NET Core 2.0 в режиме производства

В ASP.NET Core 2.0 мы имеем это

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

Это CreateDefaultBuilder(args) имеет много полезных значений по умолчанию. Однако содержит это:

.ConfigureLogging((context, logging) => {
    logging.AddConfiguration(context.Configuration.GetSection("Logging"));
    logging.AddConsole();   // HERE IS THE PROBLEM
    logging.AddDebug();     // HERE IS THE PROBLEM
})

Таким образом, поставщики регистрации консоли и отладки всегда регистрируются.

Я использовал их для регистрации

if (env.IsDevelopment())
{ 
    // register them here
}

Как удалить/отменить регистрацию при запуске в режиме производства? Я не имею в виду изменение уровня ведения журнала, я имею в виду, что я не хочу, чтобы они были зарегистрированы вообще в рабочем режиме.

Ответ 1

Я бы сказал, что разработанный способ сделать это - это изменить конфигурацию ведения журнала, чтобы не регистрировать ничего для этих поставщиков. Но я понимаю, что вы хотите удалить любые вызовы для производства; и вы все равно можете сделать это правильно в коде.

Вы можете просто получить доступ к среде хостинга из HostBuilderContext, которая будет передана в ConfigureLogging lambda:

.ConfigureLogging((context, logging) =>
{
    logging.AddConfiguration(context.Configuration.GetSection("Logging"));

    if (context.HostingEnvironment.IsDevelopment())
    {
        logging.AddConsole();
        logging.AddDebug();
    }
});

Очевидно, что это само по себе не помогает отменить то, что уже настроил вызов CreateDefaultBuilder. Во-первых, вам нужно будет отменить регистрацию этих поставщиков. Для этого вы можете использовать новый метод ILoggingBuilder.ClearProviders:

.ConfigureLogging((context, logging) =>
{
    // clear all previously registered providers
    logging.ClearProviders();

    // now register everything you *really* want
    // …
});

Это было введено в ответ на эту проблему с регистрацией на GitHub.

Ответ 2

Я думаю, что вы не можете использовать CreateDefaultBuilder или установить LogLevels None. Согласно документам вы можете использовать это.

public static void Main(string[] args)
{
var webHost = new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var env = hostingContext.HostingEnvironment;
        config.AddJsonFile("appsettings.json", optional: true, 
reloadOnChange: true)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", 
optional: true, reloadOnChange: true);
        config.AddEnvironmentVariables();
    })
    .ConfigureLogging((hostingContext, logging) =>
    {


logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
    })
    .UseStartup<Startup>()
    .Build();

webHost.Run();
}

Как добавить раздел поставщиков https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging?tabs=aspnetcore2x

Найден другой вариант, просто добавьте фильтр регистрации для консоли в appsettings.json

  "Logging": {
"IncludeScopes": false,
"LogLevel": {
  "Default": "Debug",
  "System": "Information",
  "Microsoft": "Information"
},
"Console": {
  "LogLevel": {
    "Default": "None"
  }
}

},

Ответ 3

Я даже не пробовал это сам, просто мысль. Объявите статическое свойство public static IHostingEnvironment Environment { get; set; } и на основе этой поддержки добавьте ведение журнала. Снова непроверенный код:) используйте его под свой риск
  public static IHostingEnvironment Environment { get; set; }

  public Startup(IHostingEnvironment env)
  {
           Environment = env;
  }

   public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseIISIntegration()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseKestrel()
            .UseStartup<Startup>()
            .ConfigureLogging(factory =>
            {
                if (Environment.IsDevelopment())
                {
                    factory.AddConsole();
                    factory.AddDebug();
                }
            })
            .Build();
}

Ответ 4

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

.ConfigureLogging((context, logging) => {
    foreach (ServiceDescriptor serviceDescriptor in logging.Services)
    {
        if (serviceDescriptor.ImplementationType == typeof(Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider))
        {
            // remove ConsoleLoggerProvider service only
            logging.Services.Remove(serviceDescriptor);
            break;
        }
    }

    // now you can register any new logging provider service; e.g.,
    logging.AddLog4Net();
    logging.AddEventSourceLogger();
})