web-dev-qa-db-fra.com

La journalisation .NET Core 2.0 est-elle interrompue?

Il semble impossible d'obtenir des informations de journal de niveau de trace après la mise à niveau vers .NET Core 2.0 (+ ASP.NET Core 2.0).

En fait, si je fais un projet dotnet new web et que j'ajoute le code ci-dessous dans Démarrage pour configurer, je ne reçois aucun message de trace ou de journal de débogage, mais les messages d'information et d'erreur à deux reprises. La mise en commentaire de .AddConsole()call ne produira ces informations (information et erreur) qu’une fois - ce qui suggère qu’il est configuré automatiquement avec un fournisseur de console par défaut. N'oubliez pas qu'il s'agit d'une expérience de projet "Fichier -> Nouvelle", il n'y a aucune configuration dans Program.cs pour la journalisation ou la configuration pour cela - à l'exception de ce que j'ai ajouté. Quelqu'un a vu des choses? Ou devrais-je enregistrer un problème GitHub pour cela.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Microsoft.Extensions.Logging.LogLevel.Trace);

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        var logger = loggerFactory.CreateLogger("Blah");
        logger.LogTrace("Hello world : Trace");
        logger.LogDebug("Hello world : Debug");
        logger.LogInformation("Hello world : Information");
        logger.LogError("Hello world : Error");

        await context.Response.WriteAsync("Hello World!");
    });
}
27
EinarI

La manière dont la journalisation est configurée a un peu changé ... La méthode recommandée (et elle est assez bien documentée dans ce problème/cette annonce de GitHub pour le faire maintenant/consiste à configurer les enregistreurs sur la méthode AddLogging, tels que 

services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        .AddConsole()
        .AddDebug();
});

Et avoir un appsettings.json comme 

Remarquer

Il semble que quelques personnes soient confuses, car l'exemple ne montre que la configuration du fournisseur Console et pas tous les enregistreurs.

La section LogLevel configure le niveau de journalisation pour tous les espaces de noms (clé Default) ou pour un espace de noms spécifique (System remplace la valeur par défaut pour toutes les classes de journalisation dont l'espace de noms commence par System.*.

Ceci est pour la classe utilisée dans T dans ILogger<T>). Cela permet de définir un niveau de journalisation supérieur ou inférieur au niveau par défaut pour les enregistreurs de cet espace de noms. 

{
  "ApplicationInsights": {
    "InstrumentationKey": ""
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Information",
      "System": "Warning",
      "Microsoft": "Information"
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning",
        "System": "Information",
        "Microsoft": "Information"
      }
    }
  }
}

Veuillez noter que la structure de appsettings.json a changé par rapport à ce qu'elle était dans .NET Core 1.x et que l'entrée Logging du appsettings.json contient désormais des noms de fournisseur de journalisation, ce qui vous permet de configurer les niveaux de journalisation par fournisseur de journalisation. 

Auparavant, l'entrée dans appsettings.json ne s'appliquait qu'au consignateur de la console.

Alternativement, la journalisation peut maintenant être déplacée dans la WebHostBuilder

public static void Main()
{
    var Host = 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)
                .AddJsonFile("hosting.json", optional: false)
                .AddEnvironmentVariables();
        })
        .ConfigureLogging((webhostContext, builder) => {
            builder.AddConfiguration(webhostContext.Configuration.GetSection("Logging"))
            .AddConsole()
            .AddDebug();
        })
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

    Host.Run();
}

Mettre à jour

Si vous ne souhaitez pas utiliser le appsettings.json, vous pouvez également enregistrer les filtres dans le code. 

services.AddLogging(builder =>
{
    builder.AddConfiguration(Configuration.GetSection("Logging"))
        // filter for all providers
        .AddFilter("System", LogLevel.Debug)
        // Only for Debug logger, using the provider type or it's alias
        .AddFilter("Debug", "System", LogLevel.Information)
        // Only for Console logger by provider type
        .AddFilter<DebugLoggerProvider>("System", LogLevel.Error)
        .AddConsole()
        .AddDebug();
});
29
Tseng

J'ai passé presque vingt minutes à comprendre que depuis Configuration.GetSection("Logging") dans le fichier Startup.cs lit la section "Logging" dans la configuration du fichier appsettings.json, qui a été configuré en tant que "Error". En le changeant en "Information" ou en une valeur inférieure, le problème a été résolu.

Voici à quoi ressemble le fichier appsettinsg.json:

{
  "Logging": {
    "IncludeScopes": true,
    "Debug": {
      "LogLevel": {
        "Default": "Information"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Information"
      }
    }
  }
}

Pour en savoir plus sur les niveaux de journalisation (comme dans "Information"), consultez this link, qui fournit également des informations générales sur la journalisation ASP.NET Core.

Je ne fais que publier ici, au cas où vous auriez du mal à faire en sorte que la journalisation fonctionne, assurez-vous que vous avez parcouru ce fichier JSON.

8
Shimmy

Rien de ce qui précède ne fonctionne pour moi. La seule solution consistait à écrire une méthode

private void ConfigLogging( ILoggingBuilder builder ) {
    builder.SetMinimumLevel( LogLevel.Trace );
    //... additional configuration...
}

et lorsque vous utilisez la méthode d’extension AddLogging, écrivez-le en tant que

services.AddLogging( ConfigLogging );
4
Panos Theof

La structure suivante de appsettings.json semble fonctionner correctement:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console":
    {
      "IncludeScopes": true
    }
  }
}

Extrait de https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1

Aussi, voyez ce que sont vos appels de départ, je trouve les travaux suivants pour moi:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {

        var logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Sink(jsonSink)
                .Enrich.WithExceptionDetails()
                .CreateLogger();

        Log.Logger = logger;
    }
}
0
Art