web-dev-qa-db-fra.com

Comment activer la journalisation de trace dans ASP.NET Core?

Je ne peux pas obtenir la sortie basice LogTrace(...) dans mon application. Voici une repro:

  1. Créez une nouvelle application ASP.NET Core à l'aide de Visual Studio 2017.
  2. (Facultatif) commentez .UseApplicationInsights() pour que la repro soit plus claire
  3. Remplacez le code dans ValuesController.cs avec ça:

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    
    namespace WebApplication1.Controllers
    {
        [Route("api/[controller]")]
        public class ValuesController : Controller
        {
            private readonly ILogger<ValuesController> logger;
    
            public ValuesController(ILogger<ValuesController> logger)
            {
                this.logger = logger;
            }
    
            [HttpGet]
            public IEnumerable<string> Get()
            {
                logger.LogError("ERROR!");
                logger.LogWarning("WARN!");
                logger.LogInformation("INFO!");
                logger.LogTrace("TRACE!");
                return new string[] { "value1", "value2" };
            }
        }
    }
    
  4. Changement appsettings.Development.json pour ça:

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Trace",
          "System": "Information",
          "Microsoft": "Information"
        }
      }
    }
    
  5. Exécutez et affichez la sortie de débogage

Cela mène à:

  • Sortie réelle:

    only ERROR, WARN, and INFO

  • La sortie attendue serait le "TRACE!" message aussi

J'ai essayé de modifier les valeurs dans le appsettings.json fichier également, mais cela n'a eu aucun effet non plus.

Bizarrement, changer la valeur de l'un ou l'autre fichier en "Error" ne fait rien non plus.

Conclusion/Question

Que dois-je faire pour que mon injecté ILogger<ValuesController> respecter les paramètres de journalisation, y compris le niveau Trace?


Note de bas de page

Voici une partie du code pertinent qui serait généré automatiquement avec la repro ci-dessus:

Startup.cs

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseMvc();
    }
}

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        var Host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();

        Host.Run();
    }
}

appsettings.json défaut:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}
6
Jeroen

RUPTURE DES CHANGEMENTS À PARTIR DE 2.0
Comme Tseng l'a commenté ci-dessous, cette réponse deviendra obsolète à partir de 2.0 vous pouvez en savoir plus sur cette annonce ici: - https://github.com/aspnet/Announcements/issues/238


Où se situe le problème ...

Sur la base de votre méthode Configure(), j'ai repéré un problème:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
    ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug(); // ⇦ you're not passing the LogLevel!

    app.UseMvc();
}

C'est la raison pour laquelle aucune de vos modifications apportées à la configuration définie dans les fichiers appsettings.json Ne fonctionne pas.

Le comportement par défaut de .AddDebug() sans aucun argument transmis est
Ajoute un enregistreur de débogage activé pour LogLevel.Information ou supérieur.

Si vous souhaitez le définir explicitement pour utiliser un niveau de journalisation minimum particulier, vous pouvez le transmettre directement à la méthode AddDebug(ILoggerFactory, LogLevel).

loggerFactory.AddDebug(LogLevel.Trace);

Plus d'informations peuvent être trouvées ici .


Le lier à votre configuration.

Méthode 1: récupérez la valeur dans la configuration.

LogLevel foo = this.Configuration.GetSection("Logging:LogLevel")
    .GetValue<LogLevel>("Default");
loggerFactory.AddDebug(foo);

Méthode 2: utiliser l'objet intégré pour LogLevel

(intentionnellement laissé de côté. Évidemment, il est bien ajusté entre ces deux méthodes proposées.) Je préférerais l'un des extrêmes plutôt que d'aller à mi-chemin)

Méthode 3: Go Manual (utilisez ConfigurationBinder)

La fantaisie ConfigurationBinder

var obj = new MyObject();
ConfigurationBinder.Bind(_configuration.GetSection("Logging:LogLevel"), obj);

qui correspondra à un objet comme

public class MyObject
{
    public LogLevel Default { get; set; }
    public LogLevel System { get; set; }
    public LogLevel Microsoft { get; set; }
}

afin que vous puissiez ensuite passer:

loggerFactory.AddDebug(obj.Default);

Remarque spéciale sur les nœuds et appsettings.json

Notez que le délimiteur de la configuration utilise :.

Exemple: "Logging:LogLevel" Ira:

"Logging": {
  "IncludeScopes": false,
  "LogLevel": {             ⇦⇦⇦⇦⇦ Here
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information"
  }
}

LogLevel Enum

Juste pour référence, voici les valeurs valides de LogLevel:

public enum LogLevel
{
    Trace = 0,
    Debug = 1,
    Information = 2,
    Warning = 3,
    Error = 4,
    Critical = 5,
    None = 6,
}

Source:
https://docs.Microsoft.com/en-us/aspnet/core/api/Microsoft.extensions.logging.loglevel#Microsoft_Extensions_Logging_LogLevel

14
Svek

Cela a fonctionné pour moi. Ajoutez-le dans la méthode ConfigureServices(IServiceCollection services):

services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace));
8
Juan Carlos Puerto