2017-08-31 35 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