2017-08-31 4 views
11

我々はCreateDefaultBuilder(args)は多くの有用なデフォルトを持っていることを、この削除コンソールとデバッグロガーASP.NETコア2.0ではプロダクションモードで

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

を持っています。しかし、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コールがすでに設定したもの元に戻すには役立ちません。まず、それらのプロバイダの登録を解除する必要があります。

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

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

これはthis logging issue on GitHubに応じて導入されました。そのためには、新しいILoggingBuilder.ClearProvidersメソッドを使用することができます。

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

を追加する方法、ちょうど

+0

そうですね、1.1でそれをやったのです。私はデフォルトを維持したいと思いますが、それらの登録を取り消すには、方法が必要です。 – grokky

+0

私がこれを行うことを知っている唯一の方法は、あなた自身のコードでそのクラスをオーバーライドすることです。私はIdentity PasswordHasherのためにそれをしなければならなかった。 –

0

私はこれを試してみましたhaventは、あなたのappsettings.json

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

}にコンソールのログフィルタを追加私自身、ちょっと考えました。静的プロパティ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

関連する問題