Удалять консольные и отладочные журналы в 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();
})