在生产模式下,删除ASP.NET Core 2.0中的控制台和调试记录器

gro*_*kky 23 c# asp.net-core asp.net-core-2.0

在ASP.NET Core 2.0中,我们有这个

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

CreateDefaultBuilder(args)有很多有用的默认值.但它包含这个:

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

因此,控制台和调试日志记录提供程序始终注册.

我曾经像这样注册他们

if (env.IsDevelopment())
{ 
    // register them here
}
Run Code Online (Sandbox Code Playgroud)

在生产模式下运行时如何删除/取消注册?我并不是说改变日志记录级别,我的意思是我不希望它们在生产模式下完全注册.

pok*_*oke 34

我想说,设计的方法是通过更改日志记录配置而不是将任何内容记录到这些提供程序.但我知道您要删除任何生产要求; 你仍然可以在代码中正确地做到这一点.

您可以简单地从HostBuilderContext传递给ConfigureLogginglambda 的托管环境访问:

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

    if (context.HostingEnvironment.IsDevelopment())
    {
        logging.AddConsole();
        logging.AddDebug();
    }
});
Run Code Online (Sandbox Code Playgroud)

显然,仅凭这一点并没有帮助撤消CreateDefaultBuilder已建立的呼叫.首先,您需要取消注册这些提供程序.为此,您可以使用新ILoggingBuilder.ClearProviders方法:

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

    // now register everything you *really* want
    // …
});
Run Code Online (Sandbox Code Playgroud)

这是为了响应GitHub上的这个日志记录问题而引入的.

  • 如果未找到 ClearProviders,请添加“使用命名空间 Microsoft.Extensions.Logging” (7认同)

kat*_*ash 6

我发现最好从服务中删除特定的日志记录提供程序,如下所示:

.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();
})
Run Code Online (Sandbox Code Playgroud)