Je ne peux pas obtenir la sortie basice LogTrace(...)
dans mon application. Voici une repro:
.UseApplicationInsights()
pour que la repro soit plus claireRemplacez 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" };
}
}
}
Changement appsettings.Development.json
pour ça:
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Information",
"Microsoft": "Information"
}
}
}
Exécutez et affichez la sortie de débogage
Cela mène à:
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.
Que dois-je faire pour que mon injecté ILogger<ValuesController>
respecter les paramètres de journalisation, y compris le niveau Trace
?
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"
}
}
}
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
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 .
LogLevel foo = this.Configuration.GetSection("Logging:LogLevel")
.GetValue<LogLevel>("Default");
loggerFactory.AddDebug(foo);
(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)
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);
Notez que le délimiteur de la configuration utilise :
.
Exemple: "Logging:LogLevel"
Ira:
"Logging": {
"IncludeScopes": false,
"LogLevel": { ⇦⇦⇦⇦⇦ Here
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
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,
}
Cela a fonctionné pour moi. Ajoutez-le dans la méthode ConfigureServices(IServiceCollection services)
:
services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace));