2017-08-31 39 views
11

删除控制台和调试记录器在ASP.NET 2.0的核心,我们有这个在ASP.NET 2.0的核心时,在生产模式

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

CreateDefaultBuilder(args)有许多有用的默认值。然而,它contains this

.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 
} 

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

+0

'CreateDefaultBuilder'创建用于简化设置(聚合大量常见的东西)一个新项目。在最终2.0之前,没有'DefaultBuilder'。我建议你从刚刚链接的源代码中复制代码,然后由你自己修改它,正如我所说的,“CreateDefaultBuilder”只是为了缓解这一步骤。看看它是如何完成的:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/index#rely-on-application-insights-light-up-features 。问候。 – dime2lo

+0

@ dime2lo我希望我不必那样做。除了生产模式下的日志记录之外,我对默认设置感到满意。肯定有办法撤销这些特定的注册。 – grokky

回答

11

我想说设计办法做到这一点是通过更改日志配置不记录任何东西给这些提供者。但我明白,你想删除任何生产呼叫;并且您仍然可以在代码中正确执行此操作。

你可以简单地从被传递到ConfigureLogging拉姆达的HostBuilderContext访问托管环境:

.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 
    // … 
}); 

这是为了响应this logging issue on GitHub介绍。

1

我想你不能使用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" 
    } 
} 

},

+0

是的,这就是我们在1.1版中所做的。我想保留默认设置,但撤消这些注册,一定有办法。 – grokky

+0

我知道这样做的唯一方法,就是用自己的代码覆盖该类。我必须为Identity PasswordHasher做到这一点。 –

0

我还没有试过这种我自己,只是一个想法。声明静态属性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(); 
} 
+0

这不起作用。日志配置现在是WebHostBuilder的一部分,因为从一开始就有日志记录。所以'Startup'实例是在日志配置委托运行之后创建的,这使'Startup'类型无法为委托提供环境名称。 - 除此之外,将东西存储在静态变量中是一种破解。幸运的是,还有更好的办法:) – poke