web-dev-qa-db-fra.com

Supprimer la console et déboguer les enregistreurs dans ASP.NET Core 2.0 en mode production

Dans ASP.NET Core 2.0, nous avons ceci

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

Cette CreateDefaultBuilder(args) a de nombreuses valeurs par défaut utiles. Cependant, il contient cela :

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

Ainsi, les fournisseurs de consignation et de consignation de débogage sont toujours enregistrés.

Je les enregistrais comme ça

if (env.IsDevelopment())
{ 
    // register them here
}

Comment puis-je les supprimer/désinscrire lors de l'exécution en mode production? Je ne veux pas dire changer le niveau de journalisation, je veux dire que je ne veux pas du tout qu'ils soient enregistrés en mode production.

22
grokky

Je dirais que la manière conçue de le faire serait de changer la configuration de la journalisation pour ne rien enregistrer sur ces fournisseurs. Mais je comprends que vous souhaitez supprimer tout appel à la production; et vous pouvez toujours le faire correctement dans le code.

Vous pouvez simplement accéder à l'environnement d'hébergement à partir du HostBuilderContext qui est transmis au ConfigureLogging lambda:

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

    if (context.HostingEnvironment.IsDevelopment())
    {
        logging.AddConsole();
        logging.AddDebug();
    }
});

Évidemment, cela seul n'aide pas à annuler ce que l'appel CreateDefaultBuilder a déjà configuré. Tout d'abord, vous devez annuler l'enregistrement de ces fournisseurs. Pour cela, vous pouvez utiliser le nouveau ILoggingBuilder.ClearProviders méthode:

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

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

Cela a été introduit en réponse à ce problème de journalisation sur GitHub .

34
poke

Je pense que vous ne pouvez pas utiliser le CreateDefaultBuilder alors ou définir les LogLevels sur None peut-être. Selon les documents, vous pouvez l'utiliser.

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();
}

Comment ajouter des fournisseurs Section https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/logging?tabs=aspnetcore2x

Vous avez trouvé une autre option, ajoutez simplement un filtre de journalisation pour la console dans votre appsettings.json

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

},

3
Lee Reitz